ThreadPoolExecutor.execute 方法调用流程
2021-06-10 16:14:03 1 举报
线程池原理
作者其他创作
大纲/内容
返回 false(这种情况应该很少出现)说明没有创建出核心线程来执行任务
return
CAS 修改 ctl(即改变当前线程数)
reject(command)使用拒绝策略执行任务
不再创建
return false
返回 true
ThreadPoolExecutor
未变化
false
workQueue.offer(command)将任务放入队列
当前工作线程数 == 0?
线程池状态是否发生变化?
true
否。说明当前线程数已经达到核心数。或核心线程数为 0
该图包含两部分:①:当用户向线程池提交 Runnable 时 execute 方法处理流程1)当前运行线程数,小于核心线程数,则继续创建核心线程来执行该任务;2)当前运行线程数,已经到达核心线程数(或核心线程为 0),则将任务放入 workQueue 队列;3)若 workQueue 满导致 offer 失败,则再创建非核心线程来执行任务;4)若非核心线程创建失败(最大线程数已达上限),再使用拒绝策略处理该任务;②:Worker 对象创建和线程启动过程;
状态不支持
根据当前线程池状态,决定是否继续创建 Worker
根据当前线程数决定是否可继续创建 Worker
true 表示线程创建失败
w.thread == null
创建 Worker 对象 w
执行addWorkerFailed,表示失败回滚。
false表示没有创建出非核心线程执行任务
false 表示队列已满,导致放入失败
Worker 启动成功
可继续创建
execute
修改成功
是
workerCountOf(c) < corePoolSize当前工作的线程数 < 核心线程数?
不可再创建
return true
修改失败
再次判断线程池状态,若状态支持,将 w 加入 workers 列表,并启动对应线程
addWorker 方法详解
变化
0 条评论
回复 删除
下一页