线程池执行图【ThreadPoolExecutor】
2020-12-16 15:01:00 0 举报
线程池执行图及原理
作者其他创作
大纲/内容
rs >= SHUTDOWN && ! (rs == SHUTDOWN && firstTask == null && ! workQueue.isEmpty())
再次读取线程运行状态与初始状态是否一致
判断线程运行状态,非运行且队列为空
阻塞取锁(非公平锁)
加入执行线程,线程开始执行,修改最大工作线程池大小
workerCountOf(c) < corePoolSize
mainLock.unlock()
再次检查当前线程池是否运行状态,且队列移除线程成功
移除出工作线程,CAS自减工作线程数
final ReentrantLock mainLock = this.mainLock; mainLock.lock();
if (w != null)workers.remove(w);decrementWorkerCount();tryTerminate();
否
执行线程,需判断最大线程池数量,是否成功
是
结束(true)
判断线程是运行状态或者执行任务为空
addWorker
CAS自增工作线程数是否成功
判断工作线程是否小于核心线程池大小
workers.add(w); s = workers.size(); if (s > largestPoolSize) largestPoolSize = s;
检查工作线程大于队列容量或者大于核心线程大小
结束(false)
判断工作线程为0
释放锁
execute
runStateOf(c) != rs
reject(command)
t.isAlive()
rs < SHUTDOWN || (rs == SHUTDOWN && firstTask == null)
wc >= CAPACITY || wc >= (core ? corePoolSize : maximumPoolSize)
抛异常
判断当前线程是否活跃
ThreadPoolExecutor
throw new IllegalThreadStateException();
拒绝策略
结束
workerCountOf(recheck) == 0
isRunning(c) && workQueue.offer(command)
compareAndIncrementWorkerCount(c)
判断线程是运行中,且加入阻塞队列成功
! isRunning(recheck) && remove(command)
执行线程,需判断核心线程大小
0 条评论
回复 删除
下一页