当执行线程池的execute方法时:
TERMINATED:线程池处于TIDYING状态后,会执行terminated()方法,执行完后就会进入TERMINATED状
态,在ThreadPoolExecutor中terminated()是一个空方法,可以自定义线程池重写这个方法
execute方法
public void execute(Runnable command) {1
2
if (command == null)3
throw new NullPointerException();4
5
// 获取ctl6
// ctl初始值是ctlOf(RUNNING, 0),表示线程池处于运行中,工作线程数为07
int c = ctl.get();8
9
// 工作线程数小于corePoolSize,则添加工作线程,并把command作为该线程要执行的任务10
if (workerCountOf(c) < corePoolSize) {11
// true表示添加的是核心工作线程,具体一点就是,在addWorker内部会判断当前工作
线程数是不是超过了corePoolSize
12
// 如果超过了则会添加失败,addWorker返回false,表示不能直接开启新的线程来执
行任务,而是应该先入队
13
if (addWorker(command, true))14
return;15
16
// 如果添加核心工作线程失败,那就重新获取ctl,可能是线程池状态被其他线程修改
了
17
// 也可能是其他线程也在向线程池提交任务,导致核心工作线程已经超过了
corePoolSize
18
c = ctl.get();19
}20
21
// 线程池状态是否还是RUNNING,如果是就把任务添加到阻塞队列中22
if (isRunning(c) && workQueue.offer(command)) {23
24
// 在任务入队时,线程池的状态可能也会发生改变25
// 再次检查线程池的状态,如果线程池不是RUNNING了,那就不能再接受任务了,就得
把任务从队列中移除,并进行拒绝策略
26
27
// 如果线程池的状态没有发生改变,仍然是RUNNING,那就不需要把任务从队列中移除
掉
28