ThreadPoolExecutor线程池执行线程时的流程
public void execute(Runnable command) {
if (command == null)
throw new NullPointerException();
// 得到当前执行中的线程数
int c = ctl.get();
// 对执行中的线程数+1 如果小于corePoolSize(核心线程数)
if (workerCountOf(c) < corePoolSize) {
// 将该command加入到worker中进行启动(并且是使用核心线程池启动)
if (addWorker(command, true))
return;
// 如果加入worker失败,则再次重新获取c
c = ctl.get();
}
// 如果线程池是在执行中,并且该需要执行的线程加入到workQueue等待队列成功
if (isRunning(c) && workQueue.offer(command)) {
int recheck = ctl.get();
// 如果线程池已经shutdown,并且该需要执行的线程从workQueue移除成功
if (! isRunning(recheck) && remove(command))
// 执行拒绝策略
reject(command);
else if (workerCountOf(recheck) == 0)/ 如果
// 添加到任务中
addWorker(null, false);
}
// 如果加入到worker执行失败。如果加入成功,则这里就表示是使用最大线程数启动的线程
else if (!addWorker(command, false))
// 执行拒绝策略
reject(command);
}