异步JUC

异步JUC

初始化线程的4种方式

  • 继承Thread
  • 实现Runnable接口
  • 实现CallCallable接口+FutureTask(1.5之后出现的 特点:可以拿到返回结果 可以处理异常)
  • 线程池

测试不用测试类测试不出多线程的效果
第一种在这里插入图片描述
第二种
在这里插入图片描述
第三种
在这里插入图片描述
查看futuretask会发现这是一个实现了一个继承Runnable的接口
在这里插入图片描述
测试

在这里插入图片描述
注意点:这是一个阻塞等待

第四种
整个系统一两个线程池(核心业务的非核心业务的) 而不是一个业务一个池

业务中不会用前面的三种 只会用第四种方式来操作资源达到资源的稳定性
在这里插入图片描述
在这里插入图片描述

有参数的对应第3种
无参数的对应第1,2种

直接new一个已创建好的线程传入进去即可
在这里插入图片描述

小结:
在这里插入图片描述

线程池的详细介绍

在这里插入图片描述
给线程池直接提交任务
1.创建:则ExecutorService就是线程池

  1. 直接使用Executors工具类
    在这里插入图片描述

  2. new ThreadPoolExecutor();

在这里插入图片描述
可传递参数
在这里插入图片描述

原生线程池里面的七大参数:

int corePoolSize:核心线程数[一直存在除非设置了allowCoreThreadTimeOut];线程池创建好以后就准备就绪的线程数量,就等待来接受异步任务去执行 new Thread(); 提交任务的时候就会执行空的线程 即thread.start

int maximumPoolSize:最大线程数量;作用是控制资源

long keepAliveTime:存活时间。如果当前正在运行的线程数量大于core数量。释放空闲的线程(maximumPoolSize-corePoolSize),只要线程大于指定的long keepAliveTime就会直接释放资源,避免资源浪费

TimeUnit unit:时间单位(存活时间的时间单位)

BlockingQueue workQueue:阻塞队列,如果任务有很多,就会将目前多的任务放到对列里边只要有线程空闲,就会去队列里面取出新的任务继续执行。

ThreadFactory threadFactory:线程的创建工厂,线程有自己的名字约束,就可以用工厂来创建线程

RejectedExecutionHandler handler:如果队列满了,按照我们指定的拒绝策略拒绝执行任务

工作的顺序:
在这里插入图片描述

再次说明

  1. 线程池创建,准备好core数量的核心线程,准备接受任务
    1.1 core满了,就将再进来的任务放入到阻塞队列中,空闲的core就会自己去阻塞队列获取任务执行
    1.2 阻塞队列满了,就直接开新的线程执行,最大只能开到max(int maximumPoolSize)指定的数量
    1.3 max满了就用RejectedExecutionHandler拒绝任务
    1.4 max都执行完成,有很多空闲,在指定的时间(keepAliveTime)以后 ,释放max-core这些线程
    1.5 BlockingQueue的解释:传递的参数是这个队列类型
    在这里插入图片描述
    在这里插入图片描述
    这队列的取值范围默认是Integer的最大值 内存不够直接占满 (一般是压力测试的系统峰值的数量)
    1.6 threadFactory的说明:Executors.defaultThreadFactory(使用juc包下的api来创建默认的线程工厂)
    在这里插入图片描述在这里插入图片描述
    1.7RejectedExecutionHandler在这里插入图片描述
    在这里插入图片描述1.8完成创建
    在这里插入图片描述
    1.9面试题
    按照同步的方式来执行在这里插入图片描述
    在这里插入图片描述

线程池API Executors

1在这里插入图片描述
无核心的线程
在这里插入图片描述
2.在这里插入图片描述
在这里插入图片描述
3.new ScheduleExecutorService()
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
4.
在这里插入图片描述

在这里插入图片描述

总结:
在这里插入图片描述
线程池的好处
在这里插入图片描述
又一问题的出现:

当A B C三个线程要有先后顺序或者关系,比如说C的执行的返回结果A要用这么来保证线程的顺序呢?

Completable和Future异步编排

业务场景
在这里插入图片描述
在这里插入图片描述
这相当于vue的promise可以异步编排ajax请求
在这里插入图片描述
注意这些方法里面都是关联的函数式接口()

Future怎么和FutureTask关联起来的

在这里插入图片描述
在这里插入图片描述
Future最大的特点就是能够获取到异步的结果

创建对象
在这里插入图片描述
前面两个没有返回值
后面的是有返回值得

测试
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值