线程池-内部状态

2020-09-07  本文已影响0人  rock_fish

线程池的状态主要为两种类型:

  1. 线程池的状态
  2. 线程池中线程的数量

这两个数据的存储在设计上有些巧妙,是用一个int类型的两个位段来分别表示;就是这个AtomicInteger类型的变量ctl:

  1. 高3位:用于维护线程池运行状态
  2. 低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;//即高3位为1,低29位为0
    private static final int SHUTDOWN   =  0 << COUNT_BITS;//即高3位为0,低29位为0
    private static final int STOP       =  1 << COUNT_BITS;//即高3位为001,低29位为0
    private static final int TIDYING    =  2 << COUNT_BITS;//即高3位为010,低29位为0
    private static final int TERMINATED =  3 << COUNT_BITS;//即高3位为011,低29位为0

    // Packing and unpacking ctl
    private static int runStateOf(int c)     { return c & ~CAPACITY; //c & 高3位为1,低29位为0的~CAPACITY}
    private static int workerCountOf(int c)  { return c & CAPACITY;//c & 高3位为0,低29位为1的CAPACITY }
    private static int ctlOf(int rs, int wc) { return rs | wc; }

线程池的状态分类

这些状态均由int型表示,大小关系为 RUNNING<SHUTDOWN<STOP<TIDYING<TERMINATED,这个顺序基本上也是遵循线程池从 运行 到 终止这个过程。


image.png

1、RUNNING

2、 SHUTDOWN

3、STOP

4、TIDYING

5、 TERMINATED

线程池的状态获取
状态设置

所以下边代码就初始化了线程池的状态信息:

  1. RUNNING状态
  2. 线程数为0
private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));
上一篇 下一篇

猜你喜欢

热点阅读