java并发--Executor 框架

java并发编程的艺术 读书笔记
---------------------------------------
java的线程即使工作单元也是执行机制。工作单元包括Runnable和Callable,执行机制由Executor框架负责。

|||调度模型|||
两层调度模型。在上层,java应用程序把应用分解为若干任务,然后使用用户级的调度器Executor框架来将这些任务映射出成固定数量的线程。在下层,操作系统内核将这些线程映射到硬件处理器上。

|||框架结构|||
--任务:实现了Runnable和Callable的任务类。
--执行:核心接口Executor接口及ExecutorService接口。 两个关键实现类:ThreadPoolExecutor和ScheduledThreadPoolExecutor。
--异步计算的结果:Future接口,及其实现类FutureTask。

主线程创建Runnable或者Callable任务,直接ExecutorService执行或者提交给ExecutorService执行(直接创建或者返回FutureTask对象),主线程调用FutureTask的get方法等待任务执行完成或者调用cancel方法来取消任务的执行。

|||框架成员介绍|||

||ThreadPoolExecutor||
由四个核心组件构成。
corePool:核心线程池大小
maximumPool:最大线程池大小
BlockingQueue:暂存任务的工作队列
RejectedExecutionHandler:当ThreadPoolExecutor已经关闭或者饱和(达到maximumPool&&BlockingQueue已经满),execute方法将要执行的Handler。
通常使用工厂类Executors来创建。 可以创建三种类型的ThreadPoolExecutor。
|FixedThreadPoolExecutor|
创建固定线程数的线程池,被称为可重用固定线程数的线程池。适用于为了满足资源管理的需求,而需要限制当前线程数量的应用场景,它适用于负载比较重的服务器。
new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>())
corePool == maximumPool  && keepAliveTime == 0 && 无界队列LinkedBlockingQueue不拒绝任务 ---> 固定线程数
BlockingQueue为无界队列LinkedBlockingQueue ---> 线程数达到corePoolSize之后,任务入队等待,因此maximumPool无效,并且不会有任务被拒绝

|SingleThreadPool|
创建单个线程的线程池,只有单个worker线程。适用于需要保证顺序的执行各个任务,并且在任意时间点不会有多个线程是活动的应用场景。hr
newThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>())

|CachedThreadPool|
根据需要创建大小无界的线程池。适用于执行很多短期异步任务的小程序,或者是负载较轻的服务器。
new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>())
corePool == 0 && maximumPool == Integer.MAX_VALUE ---> 线程池无界,按需创建
keepAlive == 60s ---> 空闲线程会自动消亡,按需调节线程数量
BlockingQueue为无容量队列SynchronousQueue ---> 不缓存任务,表明如果任务提交速度超过maximumPool中的线程处理速度,会持续创建新线程,极端情况下会耗尽系统cpu和内存资源。 


||ScheduledThreadPoolExecutor||
主要用于在给定的延迟之后执行任务或者定期执行任务。与Timer类似,但功能更多也更加灵活。Timer对应的是单个后台线程,而ScheduledThreadPoolExecutor可以在构造函数中指定多个对应的后台线程数。
通常使用工厂类Executors来创建。可以创建两种类型的ScheduledThreadPoolExecutor
|ScheduledThreadPoolExecutor|
创建固定线程数的线程池。适用于需要多个后台线程执行周期任务,同时为了满足资源管理的需求而需要限制后台线程数量的应用场景。
BlockingQueue为无界队列DelayQueue(封装了一个PriorityQueue) --->maximumPool参数无意义
待调度的任务ScheduledFutureTask由三个成员变量:
-time:表示这个任务将要被执行的具体时间
-sequenceNum:表示这个任务被添加到ScheduledThreadPoolExecutor的序列号
-period:任务的调度周期
DelayQueue的排序规则:time优先,time相同sequenceNum优先。因此,时间早的任务先执行,在此基础上先提交的任务先执行。

|SingleThreadScheduledExecutor|
创建单个线程的线程池。适用于需要单个后台线程执行周期任务,同时需要保证顺序的执行各个任务的应用场景。

||Future||
Future接口及其实现类FutureTask用来表示异步计算的结果。当把Runnable/Callable对象submit给ThreadPoolExecutor/ScheduledThreadPoolExecutor时,会返回一个Future/FutureTask对象。
FutureTask除了实现了Future接口之外还实现了Runnable接口。因此FutureTask可以交给Executor执行,也可以由调用线程直接执行(FutureTask.run())。根据执行的时机,FutureTask由三种状态。
-未启动:创建了FutureTask但未执行run方法。
调用get方法,调用线程将阻塞
调用cancel方法,则该任务将永远不会被执行
-已启动:run执行过程中
调用get方法,调用线程将阻塞
调用cancle(true)方法,将以中断执行此任务线程的方式来试图停止任务
调用cancle(false)方法,不会对正在执行的任务产生影响,该任务将执行完毕
-已完成:run正常结束/cancel/异常抛出
调用get方法,调用线程立即返回结果或抛出异常
调用cancel方法,将返回false

||Runnable/Callable||
其实现类可以被Executor执行。区别是Runnable不会返回结果,Callable可以返回结果。除了可以自己创建Callable之外,可以直接用工厂类Executors来将一个Runnable包装称为Callable。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值