public void execute(Runnable command) { if (command == null) throw new NullPointerException(); 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); }
判断command是否为空
获取线程状态
计算线程池中的线程数量,如果数量小于corePoolSize,就创建一个新线程执行任务
如果线程池正在运行状态,且写入队列成功。
再次获取线程池状态。判断,如果线程状态变成了非运行状态,就从队列中移除任务,调用reject()方法执行饱和策略handler
如果线程池为空,就创建一个新线程执行任务
如果第4步判断没有通过,尝试建立线程执行任务,若没有成功,就执行饱和策略handler
以一张简单的流程图描述上面的步骤:
Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx