• ThreadPoolExecutor扩展


    线程池状态

    ThreadPoolExecutor内部有多个状态,理解线程池内部状态对于理解线程池原理至关重要,所以接下来看下线程池的状态:

    /*
         * runState是整个线程池的运行生命周期状态,有如下取值:
         *  1. RUNNING:可以新加线程,同时可以处理queue中的线程。
         *  2. SHUTDOWN:不增加新线程,但是处理queue中的线程。
         *  3. STOP 不增加新线程,同时不处理queue中的线程。
         *  4. TIDYING 所有的线程都终止了(queue中),同时workerCount为0,那么此时进入TIDYING
         *  5. terminated()方法结束,变为TERMINATED
         * The runState provides the main lifecyle 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 numerical order among these values matters, to allow
         * ordered comparisons. The runState monotonically increases over
         * time, but need not hit each state. The transitions are:
         * 状态的转化主要是:
         * RUNNING -> SHUTDOWN(调用shutdown())
         *    On invocation of shutdown(), perhaps implicitly in finalize()
         * (RUNNING or SHUTDOWN) -> STOP(调用shutdownNow())
         *    On invocation of shutdownNow()
         * SHUTDOWN -> TIDYING(queue和pool均empty)
         *    When both queue and pool are empty
         * STOP -> TIDYING(pool empty,此时queue已经为empty)
         *    When pool is empty
         * TIDYING -> TERMINATED(调用terminated())
         *    When the terminated() hook method has completed
         *
         * Threads waiting in awaitTermination() will return when the
         * state reaches TERMINATED.
         *
         * Detecting the transition from SHUTDOWN to TIDYING is less
         * straightforward than you'd like because the queue may become
         * empty after non-empty and vice versa during SHUTDOWN state, but
         * we can only terminate if, after seeing that it is empty, we see
         * that workerCount is 0 (which sometimes entails a recheck -- see
         * below).
         */

    runState的存储也值得一说,它并不是用一个单独的int或者enum进行存储,而是和线程数workerCount共同保存到一个原子量ctl中:
    //利用ctl来保证当前线程池的状态和当前的线程的数量。ps:低29位为线程池容量,高3位为线程状态。
        private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));
        //设定偏移量
        private static final int COUNT_BITS = Integer.SIZE - 3;
        //确定最大的容量2^29-1
        private static final int CAPACITY   = (1 << COUNT_BITS) - 1;
        //几个状态,用Integer的高三位表示
        // runState is stored in the high-order bits
        //111
        private static final int RUNNING    = -1 << COUNT_BITS;
        //000
        private static final int SHUTDOWN   =  0 << COUNT_BITS;
        //001
        private static final int STOP       =  1 << COUNT_BITS;
        //010
        private static final int TIDYING    =  2 << COUNT_BITS;
        //011
        private static final int TERMINATED =  3 << COUNT_BITS;
        //获取线程池状态,取前三位
        // Packing and unpacking ctl
        private static int runStateOf(int c)     { return c & ~CAPACITY; }
        //获取当前正在工作的worker,主要是取后面29位
        private static int workerCountOf(int c)  { return c & CAPACITY; }
        //获取ctl
        private static int ctlOf(int rs, int wc) { return rs | wc; }
    • 通过调用runStateOf()方法获取当前线程池状态
    • 通过调用workerCountOf()获取当前线程数
     
  • 相关阅读:
    Safe Path(bfs+一维数组存图)
    一维树状数组入门
    Ancient Go(简单DFS)
    Sudoku(简单DFS)
    Strategic game(树形DP入门)
    多线程源码分析
    Navicat premium12的破解方法,无需注册码
    MySQL和Oracle的区别
    java Web项目中什么场景中会用到java多线程?
    TCP协议三次握手、四次断开 过程分析
  • 原文地址:https://www.cnblogs.com/lwy19998273333/p/7604591.html
Copyright © 2020-2023  润新知