ThreadPoolExecutor源码分析

  在熟练掌握如何使用线程池之后,我们来对ThreadPoolExecutor进行源码分析。希望大家保持对源码的阅读热情,不仅要知其然,也要知其所以然。阅读源码比较苦涩,请养成反复研究琢磨为什么这么写的精神,多推敲。冲鸭!

  其实有时候想不通的时候可以看一下英文注释,还是作者解释的精准

 

1 ThreadPoolExecutor类图

ThreadPoolExecutor源码分析

 

2 ThreadPoolExecutor重要变量 2.1 ctl

  这个变量是整个类的核心,AtomicInteger保证了原子性,这个变量存储了2个内容

线程池的状态

所有工作线程的数量

// int是4个字节,有32位,这里的ctl前3位表示线程池的状态,后29位标识工作线程的数量 private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0)); // Integer.SIZE - 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 // 运行中状态 111 00000000000000000000000000000 (-536870912) 括号内为十进制的 private static final int RUNNING = -1 << COUNT_BITS; // 关闭状态 000 00000000000000000000000000000 (0) private static final int SHUTDOWN = 0 << COUNT_BITS; // 停止状态 001 00000000000000000000000000000 (536870912) private static final int STOP = 1 << COUNT_BITS; // 整理状态 010 00000000000000000000000000000 (1073741824) private static final int TIDYING = 2 << COUNT_BITS; // 终结状态 011 00000000000000000000000000000 (1610612736) private static final int TERMINATED = 3 << COUNT_BITS; // Packing and unpacking ctl // 先非然后位与运算符获取线程池运行的状态,也就是前3位 private static int runStateOf(int c) { return c & ~CAPACITY; } // 位与运算符获取工作线程数量,也就是后29位 private static int workerCountOf(int c) { return c & CAPACITY; } private static int ctlOf(int rs, int wc) { return rs | wc; }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpgpxp.html