线程池的状态整理

在分析线程池的源码之前,有必要对线程池的几种状态整理一下;

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

posted @ 2019-07-19 17:40  beppezhang  阅读(645)  评论(0编辑  收藏  举报