线程池状态(gold_axe)

2020-10-24  本文已影响0人  胖达_4b7e

ThreadPoolExecutor 里面 有这些状态

     * The runState provides the main lifecycle control, taking on values:
     *
     *   RUNNING:  Accept new tasks and process queued tasks
     *   SHUTDOWN: Don't accept new tasks, but process queued tasks
     *   STOP:     Don't accept new tasks, don't process queued tasks,
     *             and interrupt in-progress tasks
     *   TIDYING:  All tasks have terminated, workerCount is zero,
     *             the thread transitioning to state TIDYING
     *             will run the terminated() hook method
     *   TERMINATED: terminated() has completed

状态设计机制

     * The main pool control state, ctl, is an atomic integer packing
     * two conceptual fields
     *   workerCount, indicating the effective number of threads
     *   runState,    indicating whether running, shutting down etc
    private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));

一个整形 存2值: 状态 线程数

前3bit是状态
111: RUNNING
000: SHUTDOWN
001: STOP
010: TIDYING
011: TERMINATED

    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;
public class ThreadPoolStateTest {
    //ctl是线程池中一个非常重要的变量,以它的低29位表示线程池中处于RUNNING状态的线程个数,高3位表示线程池所处的状态
   public static int COUNT_BITS = Integer.SIZE - 3;
   public static int CAPACITY   = (1 << COUNT_BITS) - 1;

    public static void main(String[] args) {
        // <<表示 左移
        int RUNNING    = -1 << COUNT_BITS;
        int SHUTDOWN   =  0 << COUNT_BITS;
        int STOP       =  1 << COUNT_BITS;
        int TIDYING    =  2 << COUNT_BITS;
        int TERMINATED =  3 << COUNT_BITS;
        System.out.println("Integer.SIZE is :"+Integer.SIZE+"  , COUNT_BITS is : "+COUNT_BITS);
        System.out.println("CAPACITY is : "+CAPACITY+" , "+Integer.toBinaryString(CAPACITY));
      //五种状态中SHUTDOWN值等于0,RUNNING值小于0,其他三种状态STOP、TIDYING、TERMINATED值均大于0
        System.out.println("RUNNING    = " + RUNNING + " = " + Integer.toBinaryString(RUNNING));
        System.out.println("SHUTDOWN   = " + SHUTDOWN + " = " + Integer.toBinaryString(SHUTDOWN));
        System.out.println("STOP       = " + STOP + "  = 00" + Integer.toBinaryString(STOP));
        System.out.println("TIDYING    = " + TIDYING + " = 0" + Integer.toBinaryString(TIDYING));
        System.out.println("TERMINATED = " + TERMINATED + " = 0" + Integer.toBinaryString(TERMINATED));
    }
    //CAPACITY低29位全1高3位全0,它与c做与运算得到的就是当前运行的线程个数
    static int workerCountOf(int c)  {
        return c & CAPACITY;
    }

}

Integer.SIZE is :32  , COUNT_BITS is : 29
CAPACITY is : 536870911 , 11111111111111111111111111111
RUNNING    = -536870912 = 11100000000000000000000000000000
SHUTDOWN   = 0 = 0
STOP       = 536870912  = 00100000000000000000000000000000
TIDYING    = 1073741824 = 01000000000000000000000000000000
TERMINATED = 1610612736 = 01100000000000000000000000000000

Process finished with exit code 0

之间的切换

     * RUNNING -> SHUTDOWN
     *    On invocation of shutdown(), perhaps implicitly in finalize()
     * (RUNNING or SHUTDOWN) -> STOP
     *    On invocation of shutdownNow()
     * SHUTDOWN -> TIDYING
     *    When both queue and pool are empty
     * STOP -> TIDYING
     *    When pool is empty
     * TIDYING -> TERMINATED
     *    When the terminated() hook method has completed

3个事件, 把生命分成4段,SHUTDOWN和STOP 取其一

上一篇下一篇

猜你喜欢

热点阅读