//ThreadPoolExecutor.java
public void execute(Runnable command) {
...
if (workerCountOf(c) < corePoolSize) { //plan A
if (addWorker(command, true))
return;
c = ctl.get();
}
if (isRunning(c) && workQueue.offer(command)) { //plan B
int recheck = ctl.get();
if (! isRunning(recheck) && remove(command))
reject(command);
else if (workerCountOf(recheck) == 0)
addWorker(null, false);
}
//addWorker(command, false) false代表可创建非核心线程来执行任务
else if (!addWorker(command, false)) //plan C
reject(command); // //plan D
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
plan A:任务的execute,先判断核心线程数量达到上限;否,则创建核心线程来执行任务;是,则执行plan B
plan B:当任务数大于核心数时,任务被加入阻塞队列,如果超过阻塞队列的容量上限,执行C
plan C: 阻塞队列不能接受任务时,且设置的maximumPoolSize大于corePoolSize,创建新的非核心线程执行任务
plan D:当plan A、B、C都无能为力时,使用拒绝策略处理