直接看源码,以下就是源码中定义的线程池的5种状态:
private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));
private static final int COUNT_BITS = Integer.SIZE - 3;
// runState is stored in the high-order bits
//对应的高3位值是111
private static final int RUNNING = -1 << COUNT_BITS;
//对应的高3位值是000
private static final int SHUTDOWN = 0 << COUNT_BITS;
//对应的高3位值是001
private static final int STOP = 1 << COUNT_BITS;
//对应的高3位值是010
private static final int TIDYING = 2 << COUNT_BITS;
//对应的高3位值是011
private static final int TERMINATED = 3 << COUNT_BITS;
为什么上面标志的是高3位。这是因为以上的变量ctl是一个32位的AtomicInteger类型的原子对象,ctl主要用来记录"线程池中的任务数量"和"线程池状态"这两个信息,其中,高3位就表示着"线程池状态",低29位则表示"线程池中的任务数量",所以就可以理解我上图源码中注释的高3位的意思了,了解即可。
线程池5种状态说明
- RUNNING:能够接收新任务,并且也能处理队列中的任务。
- SHUTDOWN:关闭状态,不再接受新提交的任务,但却可以继续处理正在执行的任务和队列中的任务。
- STOP:不接受新任务,也不会处理队列中的任务,同时会中断正在处理任务的线程。
- TIDYING:当所有的任务已终止,workerCount (有效线程数) 为0时,线程池就处于这个状态。
- TERMINATED:线程池彻底终止,就变成TERMINATED状态。
线程池状态的流转图