那些年向前冲|Java线程池深度揭秘( 二 )


(五)ScheduledThreadPoolExecutor 类 。
public class ScheduledThreadPoolExecutor extends ThreadPoolExecutor implements ScheduledExecutorService {// ... ...}ScheduledThreadPoolExecutor 类继承自 ThreadPoolExecutor 类 , 并且实现了 ScheduledExecutorService 接口 , 变成一个可定时调度任务的线程池 。
(六)ThreadPoolExecutor 类 。
public class ThreadPoolExecutor extends AbstractExecutorService {// ... ...}ThreadPoolExecutor 继承 AbstractExecutorService 抽象类 , 并实现了 execute 等一系列方法 。
(七)Executors 类 。
public class Executors {// ... ...public static ExecutorService newFixedThreadPool(int nThreads) {return new ThreadPoolExecutor(nThreads, nThreads,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue());}// ... ...}研发人员可以通过 Executors 工厂类来创建线程池并返回一个ExecutorService 对象 , 而内部几乎全是对 ThreadPoolExecutor 的封装 。
通过 Executor 的家族简单认识 , 应该能感觉到 ThreadPoolExecutor 类的重要性 , 所以接下来要重点对 ThreadPoolExecutor 类的源码进行剖析 。
源码解读:线程池状态以及状态流转
那些年向前冲|Java线程池深度揭秘上面注释截图来源于 ThreadPoolExecutor 的源码 , 别懵圈 , 仔细看差不多都能懂 , 能够看出线程池的五种状态以及对应的状态流转 。
不知道你能看懂多少 , 看不懂也没关系 , 接下来把上面的注释用图呈现给大家 。 通过源码中的注释 , 能够勾勒出如下线程池的状态流转图(好的注释是多么的重要啊 , 感叹号!) 。
那些年向前冲|Java线程池深度揭秘源码解读:部分成员变量及方法/** * ctl 是一个 AtomicInteger 类型的原子对象 。* 其实设计很有意思:ctl 共包括 32 位(高 3 位表示"线程池状态" , 低 29 位表示"线程池中的线程数量") 。* 个人感觉:线程池状态与线程数量合二为一 , 用一个变量来表示 , 来减少锁竞争 , 提高并发效率 。*/private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));/** 表示线程池线程数的位数:32 - 3 = 29 位 */private static final int COUNT_BITS = Integer.SIZE - 3;/** 表示最大线程容量(000,11111111111111111111111111111)*/private static final int CAPACITY= (1 << COUNT_BITS) - 1;// runState is stored in the high-order bits(运行状态保存在 int 值的高 3 位)/** 111,00000000000000000000000000000 */private static final int RUNNING= -1 << COUNT_BITS;/** 000,00000000000000000000000000000 */private static final int SHUTDOWN=0 << COUNT_BITS;/** 001,00000000000000000000000000000 */private static final int STOP=1 << COUNT_BITS;/** 010,00000000000000000000000000000 */private static final int TIDYING=2 << COUNT_BITS;/** 011,00000000000000000000000000000 */private static final int TERMINATED =3 << COUNT_BITS;// Packing and unpacking ctl/** 获取线程池的运行状态 */private static int runStateOf(int c){ return c}/** 线程池内有效线程的数量 (workerCount) */private static int workerCountOf(int c){ return c}/** 线程池的状态和线程的数量组装 , 成为 ctl */private static int ctlOf(int rs, int wc) { return rs | wc; }


推荐阅读