线程池的状态整理
在分析线程池的源码之前,有必要对线程池的几种状态整理一下;
1:首先看看几种状态的定义:
//ctl记录了"线程池中的任务数量"和"线程池状态"2个信息
//ctl共包括32位。其中,高3位表示"线程池状态",低29位表示"线程池中的任务数量"
private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));
private static final int COUNT_BITS = Integer.SIZE - 3;
private static final int CAPACITY = (1 << COUNT_BITS) - 1;
// runState is stored in the high-order bits
private static final int RUNNING = -1 << COUNT_BITS;
private static final int SHUTDOWN = 0 << COUNT_BITS;
private static final int STOP = 1 << COUNT_BITS;
private static final int TIDYING = 2 << COUNT_BITS;
private static final int TERMINATED = 3 << COUNT_BITS;
// 具体的几种状态对应的高三位的值
RUNNING -- 对应的高3位值是111。
SHUTDOWN -- 对应的高3位值是000。
STOP -- 对应的高3位值是001。
TIDYING -- 对应的高3位值是010。
TERMINATED -- 对应的高3位值是011。
//几种状态的说明:
RUNNING
线程池处在RUNNING状态时,能够接收新任务,以及对已添加的任务进行处理
状态切换:线程池初始时状态是RUNNING,一旦线程池创建就处于RUNNING状态,
下面是线程池初始化的时候执行的:
private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0)); //初始化后任务数是0
SHUTDOWN
线程池处在SHUTDOWN状态时,不接收新任务,但能处理已添加的任务
调用线程池的shutdown()接口时,线程池由RUNNING -> SHUTDOWN
STOP
线程池处在STOP状态时,不接收新任务,不处理已添加的任务,并且会中断正在处理的任务
调用线程池的shutdownNow()接口时,线程池由(RUNNING or SHUTDOWN ) -> STOP