java多线程总结(代码片段)

chaunqi1995 chaunqi1995     2023-02-04     403

关键词:

1.多线程开发又叫JUC开发(java.util.concurrent),至少5年以上才能涉及到,面试阿里常问

2.线程和进程有什么区别?

1)进程是资源(CUP,内存)分配的最小单位,线程是程序执行的最小单位。

2)一个程序至少有一个进程,一个进程至少有一个线程。

3.多线程的特点

三高:高并发,高可用,高性能。

4.线程核心概念

1)线程就是独立的执行路径。

2)在程序执行时,即使没有自己创建线程,后台也会存在多个线程,如GC线程,主线程。

3)main()称之为主线程,为系统的入口点,用于执行整个程序。

4)在一个进程中,如果开辟了多个线程,线程的运行由调度器安排调度,调度器是与操作系统紧密相关的,先后顺序是不能人为干预的。

5)对同一份资源操作时,会存在资源抢夺的问题,需要加入并发控制。

6)线程会带来额外的开销,如CUP调度时间,并发控制开销。

7)每个线程在自己的工作内存交互,加载和存储主内存控制不当会造成数据不一致。

5.Java中哪个方法必须在方法内部处理异常并且不能抛出?

多线程实现方法中,继承Thread的Run()方法是不能进行方法内部处理异常并且不能抛出的。

5.多线程的实现方式

1)继承Thread

public class MyThread extends Thread
    
    @Override
    public void run() 
        for (int i = 1; i <= 50; i++) 
            System.out.println(Thread.currentThread().getName() + "---" + i);
        
    


public class Test 

    public static void main(String[] args) 
        MyThread m1 = new MyThread();
        MyThread m2 = new MyThread();
        m1.start();
        m2.start();
    

    

2)实现Runnable接口(推荐使用)

public class MyThread implements Runnable 
    
    @Override
    public void run() 
        for (int i = 1; i <= 50; i++) 
            System.out.println(Thread.currentThread().getName() + "---" + i);
        
    

public class Test 
public static void main(String[] args) MyThread m = new MyThread(); Thread t1 = new Thread(m); Thread t2 = new Thread(m); t1.start(); t2.start();

3)实现Callable接口

<1>

/**
 * 实现Callable接口.相较于实现Runnable接口的方式,方法可以有返回值,并且可以抛出异常
 * 执行 Callable 方式,需要 FutureTask 实现类的支持,用于接收运算结果。  FutureTask 是  Future 接口的实现类
 * @author 奇
 *
 */
public class ThreadDemo implements Callable<Integer> 

    @Override
    public Integer call() throws Exception 
        int sum = 0;
        for (int i = 0; i < 50; i++) 
            sum += i; 
        
        return sum;
    

public class TestCallable 
public static void main(String[] args) ThreadDemo td = new ThreadDemo(); //1.执行 Callable 方式,需要 FutureTask 实现类的支持,用于接收运算结果。 FutureTask<Integer> result = new FutureTask<Integer>(td); Thread t = new Thread(result); t.start(); //2.接收线程运算后的结果 try //FutureTask 可用于 闭锁 类似于CountDownLatch的作用,在所有的线程没有执行完成之后这里是不会执行的 Integer sum = result.get(); System.out.println(sum); System.out.println("------------------------------------"); catch (InterruptedException e) e.printStackTrace(); catch (ExecutionException e) e.printStackTrace();

<2>(面试中推荐说这个)

/**
 * 实现Callable接口,他有泛型
 * 实现Callable的call()方法
 * call()方法与run()方法的区别:有返回值,可以对异常类型进行抛出(throws)
 * run方法没有返回值,遇到异常必须try-catch处理
 * @author 奇
 *
 */
public class Test04 implements Callable<Integer> 
    
    @Override
    public Integer call() throws Exception 
        int sum = 0;
        for (int i = 0; i < 50; i++) 
            sum += i; 
        
        return sum;
    
    
    /**
     * 1.创建服务(线程池,里面放一个线程)
     * 2.提交线程
     * 3.获得结果对象
     * 4.通过结果对象的get方法来获得结果
     * 5.关闭服务
     * @param args
     * @throws InterruptedException
     * @throws ExecutionException
     */
    public static void main(String[] args) throws InterruptedException, ExecutionException 
        //与线程池有关
        Test04 t = new Test04();
        //创建一个线程池,也就是创建一个服务,线程池里面放了1个线程
        ExecutorService ser = Executors.newScheduledThreadPool(1);
        //提交执行
        //提交一个返回值的任务用于执行,返回一个表示任务的计算结果
        //Future表示异步计算结果,只能用get方法get()来拿到这个结果
        Future<Integer> res = ser.submit(t);
        //获得结果
        Integer r1 = res.get();
        System.out.println(r1);
        //关闭服务操作
        ser.shutdownNow();
    

6.线程中常用的方法

1)获取线程名称:Thread.currentThread().getName();

2)设置线程名称:

<1>Thread.currentThread().setName("要设置的名字");

<2>实现Runnable()接口的时候new Thread(new StrartThread() , "要设置的名字").start();

7.使用start()方法会立即启动线程吗?

不会,他会通知CPU,CPU进行调度,说的专业点就叫时间片。









java多线程只是总结(代码片段)

一,线程的生命周期以及五种基本状态  关于JAVA线程的生命周期,首先看一下下面这张图  上图中基本上囊括了Java中多线程各重要知识点。掌握了上图中的各知识点,Java中的多线程也就基本上掌握了。Java线程具有五... 查看详情

java总结篇系列:java多线程(代码片段)

多线程作为Java中很重要的一个知识点,在此还是有必要总结一下的。一.线程的生命周期及五种基本状态关于Java中线程的生命周期,首先看一下下面这张较为经典的图:上图中基本上囊括了Java中多线程各重要知识点。掌握了上... 查看详情

java总结篇系列:java多线程(代码片段)

Java总结篇系列:Java多线程(一)多线程作为Java中很重要的一个知识点,在此还是有必要总结一下的。一.线程的生命周期及五种基本状态关于Java中线程的生命周期,首先看一下下面这张较为经典的图:上... 查看详情

java多线程详解总结(代码片段)

...的单位,系统在运行时会为每个进程分配不同的内存区域线程(thread):进 查看详情

java基础知识点笔记总结(代码片段)

文章目录1.IntellijIDEA软件使用2.多线程的概念3.方式一继承Thread线程3.1继承Thread创建线程3.2Thread方式两个问题3.3Thread匿名对象创建线程3.4Thread类常用的方法3.5线程的调度4.方式二实现Runnable接口创建多线程5.两种创建多线程方式的对... 查看详情

java基础之多线程总结三(aqsthreadlocal和线程池)(代码片段)

AQS多线程里很多新型锁实现的关键是AQS,AQS指的是AbstractQueuedSynchronizer这个类,整个锁实现过程的关键是CAS操作加volatile。拿ReentrantLock非公平锁的lock和unlock举例,首先lock的源码中调用过程如下:ReentrantLock.lock()--&g... 查看详情

[转]java多线程学习(总结很详细!!!)(代码片段)

 Java多线程学习(总结很详细!!!)   此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更上一个台阶呢?       本... 查看详情

号称史上最全java多线程与并发面试题总结—基础篇(代码片段)

前言 多线程(multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括... 查看详情

java多线程总结(代码片段)

1.多线程开发又叫JUC开发(java.util.concurrent),至少5年以上才能涉及到,面试阿里常问2.线程和进程有什么区别?1)进程是资源(CUP,内存)分配的最小单位,线程是程序执行的最小单位。2)一个程序至少有一个进程,一个进程... 查看详情

java线程池spring线程池多线程知识总结(代码片段)

jdk线程池线程池的几个重要参数线程池有有界/无界队列、拒绝策略、核心线程数、最大线程数、空闲时间这几个重要参数,线程池的执行流程是,来了一个任务,如果核心线程数未满,则创建线程执行;如果... 查看详情

java总结篇系列:java多线程(代码片段)

多线程作为Java中很重要的一个知识点,在此还是有必要总结一下的。一.线程的生命周期及五种基本状态关于Java中线程的生命周期,首先看一下下面这张较为经典的图:上图中基本上囊括了Java中多线程各重要知识点。掌握了上... 查看详情

java线程池学习总结(代码片段)

Java线程池使用总结线程池算是Java开发、Android开发中多线程开发的时候经常使用的东西。以下是关于线程池的简单学习。文章目录前言线程池线程池的好处:ThreadPoolExecutor系统提供的线程池实现1、FixedThreadPool:2、5.SingleT... 查看详情

java基础——多线程(代码片段)

文章目录1、线程、进程、多任务多任务多线程程序(进程)多进程与多线程的区别多线程解释2、线程状态1.新线程创建(new)三种创建方式:(只关注前两种)方法1方法2总结方法三(了解即可)2.线程停... 查看详情

java并发常见面试题总结(上)(代码片段)

Java并发常见面试题总结--上什么是线程和进程?何为进程?何为线程?请简要描述线程与进程的关系,区别及优缺点?图解进程和线程的关系程序计数器为什么是私有的?虚拟机栈和本地方法栈为什么是私有的?一句话简单了解堆和... 查看详情

java基础+集合+多线程+jvm面试题总结(代码片段)

大家好,我是脚丫先生(o^^o)最近系统的总结了前辈们的各种面试题,站在巨人们的肩膀上真是看得远,我想只有对前辈们的知识进行自我的优化与吸收,才能形成适合自己的一份笔记。文章目录一、Java基础1.1面向... 查看详情

java基础之多线程总结一(创建状态synchronized和volatile)(代码片段)

线程基本创建和启动方式不考虑线程池的情况下,创建和启动线程的基本方式有如下几种1.直接newThread类或者子类,2.实现runnable接口然后传递给Thread,这种方式更加灵活3.使用lambda表达式,实际上是实现runnable另一种写... 查看详情

多线程-countdownlatch总结(代码片段)

问题当主线程的任务执行,需要依赖多个子线程运行结束后才能往下执行时如何解决,比如文件分段下载,同时开启多个子线程进行文件的分段下载,当下载完成之后,再进行组装。有一种解决方式,便是... 查看详情

多线程-countdownlatch总结(代码片段)

问题当主线程的任务执行,需要依赖多个子线程运行结束后才能往下执行时如何解决,比如文件分段下载,同时开启多个子线程进行文件的分段下载,当下载完成之后,再进行组装。有一种解决方式,便是... 查看详情