1 五个状态
1.Running:运行态,也是线程池的默认状态,当new一个ThreadPoolExecutor实例之后,这个ThreadPoolExecutor的状态就是运行态。运行态能够接受新添加任务,也能够对阻塞队列中的任务进行处理。
2.SHOTDOWN:关闭态,当调用ThreadPoolExecutor实例的showdown()方法之后,这个ThreadPoolExecutor实例就会进入关闭态。关闭态能够对阻塞队列中的任务进行处理,不能够接受新添加的非空任务,但是可以接受新添加的空任务。
3.STOP:停止态,当调用ThreadPoolExecutor实例的shutdownNow()方法之后,这个ThreadPoolExecutor实例就会进入停止态。停止态不能接受新添加任务,也不能够对阻塞队列中的任务进行处理,并且会中断正在运行的任务。
4.TIDYING:整理态,当线程池中所有任务已被终止, 这个ThreadPoolExecutor实例就会进入停止态。
5.TERMINATED:结束态,当线程池处于整理态,并调用terminated()方法,执行完毕之后,就会进入结束态,此状态也表示整个线程池生命周期的结束。
2 一些成员变量
ctl是线程池中非常重要的一个参数,是一个32位的二进制数,高三位表示线程池状态,低29位表示线程池中处于Running状态的线程数。
private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));
COUNT_BITS表示RUNNING状态下的线程数对应二进制的位数,也就是29。
private static final int COUNT_BITS = Integer.SIZE - 3;
CAPACITY用于与ctl做与运算,得到RUNNING状态下线程的个数。CAPACITY的值为
private static final int CAPACITY = (1 << COUNT_BITS) - 1;
// 00011111 11111111 111111111 11111111
五个状态变量
// runState is stored in the high-order bits
private static final int RUNNING = -1 << COUNT_BITS;
// 11100000 00000000 00000000 00000000
private static final int SHUTDOWN = 0 << COUNT_BITS;
// 00000000 00000000 00000000 00000000
private static final int STOP = 1 << COUNT_BITS;
// 00100000 00000000 00000000 00000000
private static final int TIDYING = 2 << COUNT_BITS;
// 01000000 00000000 00000000 00000000
private static final int TERMINATED = 3 << COUNT_BITS;
// 01100000 00000000 00000000 00000000
3 状态转换