线程池执行流程 初稿
2021-07-11 00:20:36 0 举报
线程池执行流程
作者其他创作
大纲/内容
start
检查当前线程是否有效,无效的话重置线程数量(-1)检查线程是否超时或者线程数量大于最大线程,是的话重置线程数量(-1)take获取工作线程(woker),如果已经为空,则阻塞。
notEmpty.signal()他唤醒了谁?唤醒了take中的while循环判断
有效
是
检查是否运行状态并且尝试加入工作队列
runWorker
workerStarted=false会清除队列中当前worker
true
检查当前工作队列数量是否大于线程池数量
reject(command)拒绝策略
runStateOf获取线程状态
compareAndIncrementWorkerCount更改线程数量
task
task.run()执行功能线程方法
take()
单向链表
addWorker加入工作队列
false
自旋检查是否有效线程
加入一个空的task结束添加
线程数量小于核心线程数
getTask获取任务||当前工作队列 中的线程是否为空
无效
c = ctl.get()重新获取线程状态
workerAdded = true 添加成功
largestPoolSize = 当前工作队列数量
否
检查线程是否有效
true 修改成功,继跳出循环执行下面代码
当前线程数量是否已经满了
唤醒take中循环判断线程数量的逻数
workers.add(w);将工作线程加入工作队列
w.unlock()允许中断
goto retry
workerCountOf获取当前线程数
临时工作worker从这里被回收
比较修改前的线程 状态和当前线程 状态是否相等
线程状态不在运行状态,尝试移除当前线程
启动worker线程workerStarted=trueworker启动成功
加入队列后,数量若小于或等于最大线程数
executors.execute
获取单向链表中的任务
notFull.signal()这里有做了啥?
不相等 修改失败 返回标记点 自旋
增加的工作队列
0 条评论
回复 删除
下一页