线程池运行原理与各个线程创建时机
最近面试遇到线程池相关问题,感觉自己线程池理解不够深入,因此总结一下线程池的运行原理和核心线程、普通线程创建时机。
提交任务
创建时机
- 普通线程只有任务等待队列满载后才会创建
- 核心线程在任务提交时就尝试创建
- 先判断核心线程是否已满,然后尝试入队,入队失败再尝试创建普通线程,超过最大线程则执行任务拒绝策略。
具体流程代码
int c = ctl.get();
//是否小于核心线程数
if (workerCountOf(c) < corePoolSize) {
if (addWorker(command, true))
return;
c = ctl.get();
}
//添加到等待队列
if (isRunning(c) && workQueue.offer(command)) {
int recheck = ctl.get();
if (! isRunning(recheck) && remove(command))
reject(command);
else if (workerCountOf(recheck) == 0)
addWorker(null, false);
}//失败执行拒绝策略
else if (!addWorker(command, false))
reject(command);
京公网安备 11010502036488号