一 ThreadPool源码分析
ThreadPool源码 主要是ThreadPoolExecutor ,这个类里面执行的,在去阅读源码之前,需要去了解下线程池的执行过程,以及线程池的参数,可以参考文章
二 ThreadPoolExecutor源码分析
闲话不多说我们直接看下源码分析。我们这里的源码分析主要是分析一下ThreadPoolExecutor 的 execute 方法,在看这个方法的源码之前,先来了解下这个类的核心属性,代码及相关的注释如下所示:
//记录线程信息的标志,由于是integer的类型,所以这个属性的值一共有32位,
//是一个线程安全的整形。初始状态位Running,表示线程池的状态
//32位的数据一共分为两部分,1到29位来统计线程的个数,30到32位来表示线程的状态
private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));
//设置统计线程的个数的位数
private static final int COUNT_BITS = Integer.SIZE - 3;
//设置线程池中线程的最大容量2的29次方减一个
private static final int CAPACITY = (1 << COUNT_BITS) - 1;
// runState is stored in the high-order bits
//线程池的状态 RUNNING, SHUTDOWN, STOP, TIDYING, TERMINATED
//线程池的状态有-1,0,1,2,3这五种状态,由于线程池的状态是在30到32位之间的二进制表示,
//所以线程池的状态值要左移29位,防止与线程数量统计的值冲突,于是
//RUNNING 的线程值位 -1左移29位,即为-536870912
private static final int RUNNING = -1 << COUNT_BITS;
//SHUTDOWN 的线程值位 0左移29位,即为0
private static final int SHUTDOWN = 0 << COUNT_BITS;
//STOP 的线程值位 1左移29位,即为536870912
private static