线程池运行原理与各个线程创建时机
最近面试遇到线程池相关问题,感觉自己线程池理解不够深入,因此总结一下线程池的运行原理和核心线程、普通线程创建时机。
提交任务
创建时机
- 普通线程只有任务等待队列满载后才会创建
- 核心线程在任务提交时就尝试创建
- 先判断核心线程是否已满,然后尝试入队,入队失败再尝试创建普通线程,超过最大线程则执行任务拒绝策略。
具体流程代码
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);