ThreadPoolExecutor
2021-08-03 08:51:11 0 举报
AI智能生成
ThreadPoolExecutor 主要逻辑源码分析
作者其他创作
大纲/内容
processWorkerExit
Worker线程开始回收
统计线程池中完成任务的数量--completedTaskCount
移除线程的引用--workers.remove(w);
是否需要设置线程池为terminated(终止)
是,设置为terminated
否,增加线程,维持核心线程数
构造函数
corePoolSize
线程池里的核心线程数量
maximumPoolSize
线程池里最大的线程数量
keepAliveTime
空闲线程等待时间,线程池中的线程数量比核心数量值大了以后,多出来的线程会等待指定的时间后释放
unit
keepAliveTime单位
workQueue
所有线程都繁忙的时候,任务等待队列
threadFactory
如果需要创建新的线程放入线程池的时候,就是通过这个线程工厂来创建的
handler
如果workQueue有固定大小,当任务超过了queue大小,用handler来处理
workQueue
execute
如果任务为null,抛出NPE异常
原子变量ctl共同存储 线程状态+线程个数。说白了就是用一个int型变量存储两个数,高3位表示线程状态,后面29位表示线程的个数
判断当前线程数 是否小于 核心线程数, 如果小于,开启新的线程执行任务
如果线程池处于RUNNING状态,添加任务到阻塞队列
重新获取下ctl的值,因为把任务添加到队列时,线程的状态可能已经改变,这里重新获取下
线程状态不是RUNNING状态,从队列里删除
如果当前线程池一个线程也没有,添加一个线程
如果队列满了,则添加新的线程(非核心线程),如果新增失败,执行拒绝策略
Worker
AbstractQueuedSynchronizer
Runnable
run
runWorker
getTask
workQueue.take()
拒绝策略(RejectedExecutionHandler)
AbortPolicy
直接抛出RejectedExecutionException,阻止任务执行
DiscardPolicy
方法没有任何实现,会默默的丢弃任务,而不做任何的处理
DiscardOldestPolicy
优先丢弃队列的头部任务,也就是第一个;然后提交执行最新的任务
获取并移除第一个任务--e.getQueue().poll();
提交执行最新的任务--e.execute(r);
提交执行最新的任务--e.execute(r);
CallerRunsPolicy
只要线程未关闭,直接在提交任务的这个线程里执行当前这个任务;这样做不会丢弃任务,但是会阻塞其他任务的执行,造成业务性能下降
0 条评论
下一页