那些年向前冲|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 类的源码进行剖析 。
源码解读:线程池状态以及状态流转 上面注释截图来源于 ThreadPoolExecutor 的源码 , 别懵圈 , 仔细看差不多都能懂 , 能够看出线程池的五种状态以及对应的状态流转 。
不知道你能看懂多少 , 看不懂也没关系 , 接下来把上面的注释用图呈现给大家 。 通过源码中的注释 , 能够勾勒出如下线程池的状态流转图(好的注释是多么的重要啊 , 感叹号!) 。
源码解读:部分成员变量及方法
/** * 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; }
推荐阅读
- 小机灵鬼|干货速来!透彻剖析微服务架构设计模式,深入开发Java有奇效
- 罗云熙|盘点那些古装帅,现代装却很“丑”的3位男神,罗云熙任嘉伦上榜
- 大众报业·海报新闻|盘点那些低价转让的公司,长城宽带100万元打包转让
- Java|计算机专业的本科生,该选择学习Java技术体系还是.NET技术体系
- 【】长城宽带100万元打包转让 盘点那些低价转让的公司
- 时尚广州|T恤的标语你了解过吗?揭秘衣服上那些奇怪的字句
- 刘药师话用药|有一种健康和美丽,从脚下开始,足部护理那些事儿
- 穿搭日记|那些一眼就让人爱上的明星耳环,便宜的才几百,陈小纭金晨都在戴
- 穿搭|那些乘风破浪的姐姐们,为什么每次都能把职业装穿得美出圈?
- 穿搭■为什么气质上总是输一大截?来看看那些教科书式的穿搭吧,学起来
