// 提交任务,任务并非立即执行,所以翻译成执行任务似乎不太合适 public void execute(Runnable command) { // 任务不能为空 if (command == null) throw new NullPointerException(); // 控制变量(高3位存储状态,低29位存储工作线程的数量) int c = ctl.get(); // 1. 如果工作线程数量小于核心数量 if (workerCountOf(c) < corePoolSize) { // 就添加一个工作线程(核心) if (addWorker(command, true)) return; // 重新获取下控制变量 c = ctl.get(); } // 2. 如果达到了核心数量且线程池是运行状态,任务入队列 if (isRunning(c) && workQueue.offer(command)) { int recheck = ctl.get(); // 再次检查线程池状态,如果不是运行状态,就移除任务并执行拒绝策略 if (! isRunning(recheck) && remove(command)) reject(command); // 容错检查工作线程数量是否为0,如果为0就创建一个 else if (workerCountOf(recheck) == 0) addWorker(null, false); } // 3. 任务入队列失败,尝试创建非核心工作线程 else if (!addWorker(command, false)) // 非核心工作线程创建失败,执行拒绝策略 reject(command); }