源码基于JDK11。核心部分和JDK8的差不多,只是有些地方换了写法,个人感觉是为了增加可读性而修改的。
源码需要耐下心来看,多看几遍总会有收获的。每看一遍可能就会有新的顿悟之感,不得不佩服Doug Lea大神。建议自己能照着源码自己看一遍,这样收获会比较大。
//ctl表示当前线程池状态以及当前线程池的有效线程数
//它是使用一个Integer来表示状态的,它将32的Integer分为了两部分,最左边三位表示状态,右边的表示当前线有效线程数
//111 - 0 0000 0000 0000 0000 0000 0000 0001 表示当前状态为RUNNING,线程池中有一个有效线程
private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));
//用于移位操作 该值为29
private static final int COUNT_BITS = Integer.SIZE - 3;
//值为 000 - 1 1111 1111 1111 1111 1111 1111 1111 用于计算状态或者当前线程池有效线程数。
//通过与运算可以得到有效线程数,同样的与~COUNT_MASK可以得到当前状态,下面有两个方法计算有效线程数和状态
private static final int COUNT_MASK = (1 << COUNT_BITS) - 1;
//几个状态,下面会分析
// runState is stored in the high-order bits
private static final int RUNNING = -1 << COUNT_BITS;
private static final int SHUTDOWN = 0 << COUNT_BITS;
private static final int STOP = 1 << COUNT_BITS;
private static final int TIDYING = 2 << COUNT_BITS;
private static final int TERMINATED = 3 << COUNT_BITS;
// Packing and unpacking ctl
//用于获取运行状态
private static int runStateOf(int c) { return c & ~COUNT_MASK; }
//用于获取核心线程数,Worker是线程的封装,基于AQS,后面会分析源码
private static int workerCountOf(int c) { return c & COUNT_MASK; }
//按位或运算,把两个值合并成一个值。
/* 000-1111...1111
* 111-0000...0000
* ——————————————— 按位与 |
* 111-1111...1111
*/
private static int ctlOf(int rs, int wc) { return rs | wc; }
/*
* Bit field accessors that don't require unpacking ctl.
* These depend on the bit layout and on workerCount being never negative.
*/
//判断当前运行状态是否低于s 比如s是STOP,就是c是RUNNING就会返回true
private static boolean runStateLessThan(int c, int s) {
return c < s;
}
//判断当前状态是否最低为s
private static boolean runStateAtLeast(int c, int s) {
return c >= s;
}
//判断线程池是否还是RUNNING状态
private static boolean isRunning(int c) {
return c < SHUTDOWN;
}
/**
* Attempts to CAS-increment the workerCount field of ctl.
*/
//通过CAS来增加线程计数值
private boolean compareAndIncrementWorkerCount(int expect) {
return ctl.compareAndSet(expect, expect + 1);
}
/**
* Worker继承AQS,0表示未锁定,1表示锁定,很像一个互斥锁
*/
private final class Worker
extends AbstractQueuedSynchronizer
implements Runnable
{
private static final long serialVersionUID = 6138294804551838833L;
//封装的线程
final Thread thread;
//任务
Runnable firstTask;
//当前Worker已完成的任务数
volatile long completedTasks;
//构造函数,通过线程工程来创建线程传给Worker,并将AQS的state设置为-1
Worker(Runnable firstTask) {
setState(-1); // inhibit interrupts until runWorker
this.firstTask = firstTask;
this.thread = getThreadFactory().newThread(this);
}
//runWorker方法会安全的启动Worker
public void run() {
runWorker(this);
}
//AQS的方法 覆写该方法说明Worker是独占的,只能一个线程执行
protected boolean isHeldExclusively() {
return getState() != 0;
}
//尝试独占的获取资源,参数并有用到 unused,因为Worker相当于不可重入的锁,state为1时是无法再通过acquire来获取资源的
protected boolean tryAcquire(int unused) {
if (compareAndSetState(0, 1)) {
setExclusiveOwnerThread(Thread.currentThread());
return true;
}
return false;
}
//AQS方法 释放资源 在这里就是将独占标记清空,设置state为0
protected boolean tryRelease(int unused) {
setExclusiveOwnerThread(null);
setState(0);
return true;
}
//加锁解锁
public void lock() { acquire(1); }
public boolean tryLock() { return tryAcquire(1); }
public void unlock() { release(1); }
public boolean isLocked() { return isHeldExclusively(); }
void interruptIfStarted() {
Thread t;
if (getState() >= 0 && (t = thread) != null && !t.isInterrupted()) {
try {
t.interrupt();
} catch (SecurityException ignore) {
}
}
}
}
public void execute(Runnable command) {
if (command == null)
throw new NullPointerException();
//获取可以表示当前线程状态以及线程数量的值
int c = ctl.get();
//如果当前工作线程数小于核心线程数,那么创建一个核心线程来执行任务
if (workerCountOf(c) < corePoolSize) {
//如果创建成功直接返回,否则执行下面的逻辑
//true表示使用corePoolSize来判断创建线程是否超过限制
//addWorker会在后面分析
if (addWorker(command, true))
return;
c = ctl.get();
}
//判断线程池的状态并尝试将任务放入工作队列
//如果线程池不处于RUNNING状态或者工作队列已经满了,就执行后面的else逻辑
if (isRunning(c) && workQueue.offer(command)) {
int recheck = ctl.get();
//重新检查,放着在向工作队列添加任务的过程中,线程池的运行状态改变
//如果线程池的运行状态不为RUNNING,那么就去移除刚才添加的任务并且执行拒绝策略
if (! isRunning(recheck) && remove(command))
reject(command);
//如果工作线程数为0,会去创建一个线程,
//null表示新建的线程不会去执行任务,因为任务已经放到阻塞队列里了
//false表示使用maximumPoolSize来判断线程数量是否超过限制
else if (workerCountOf(recheck) == 0)
addWorker(null, false);
}
//如果阻塞队列满了,并且线程池中线程数也达到了最大,那么就会执行拒绝策略
else if (!addWorker(command, false))
reject(command);
}
执行过程
private boolean addWorker(Runnable firstTask, boolean core) {
//retry是一个标签
//在下面的循环里,break retry会直接跳出下面的for循环
//continue retry会回到retry标签这里执行
retry:
for (int c = ctl.get();;) {
// Check if queue empty only if necessary.
//如果是RUNNING状态 会跳过该判断
/*如果①当前状态是SHUTDOWN以上的状态(非RUNNING) 并且 ②
* |-- 是STOP以上的状态 或者
* |-- 不是STOP以上的状态(是SHUTDOWN)但firstTask不为null 或者
* |-- 不是STOP以上的状态并且firstTask为null但阻塞队列为空
* 只要满足①和②,就会直接返回false,也就是说当前状态不能创建线程
* 这里看不明白为什么这样判断没事 后面会有分析
*/
if (runStateAtLeast(c, SHUTDOWN)
&& (runStateAtLeast(c, STOP)
|| firstTask != null
|| workQueue.isEmpty()))
return false;
//到这里说明当前状态下可以创建线程,下面的循环是通过CAS来增加一个线程数
for (;;) {
//根据传来的core参数来判断当前工作线程数是否超过了限制,超过则创建失败
if (workerCountOf(c)
>= ((core ? corePoolSize : maximumPoolSize) & COUNT_MASK))
return false;
//如果CAS自增成功,那么中断整个循环
if (compareAndIncrementWorkerCount(c))
break retry;
c = ctl.get(); // Re-read ctl
//如果CAS失败,那么继续循环
if (runStateAtLeast(c, SHUTDOWN))
continue retry;
// else CAS failed due to workerCount change; retry inner loop
}
}
//到这里说明CAS已经成功了,也就是说线程池已经认为我们增加了一个线程了
//下面开始真正的开始创建一个Worker
//俩个标志,名字有自解释性
boolean workerStarted = false;
boolean workerAdded = false;
Worker w = null;
try {
//创建一个worker,在构造函数中利用线程工厂创建一个线程给worker
w = new Worker(firstTask);
//得到刚才给worker创建的线程,它的任务自然是firstTask
final Thread t = w.thread;
if (t != null) {
//获取主锁
final ReentrantLock mainLock = this.mainLock;
mainLock.lock();
try {
int c = ctl.get();
//在线程池还是RUNNING状态或者虽然停止但是firstTask为空的情况下
//检查t是否已经是Alive状态了,如果是则抛出异常
if (isRunning(c) ||
(runStateLessThan(c, STOP) && firstTask == null)) {
if (t.isAlive()) // precheck that t is startable
throw new IllegalThreadStateException();
//workers是一个HashSet,现在可以将worker放入了
workers.add(w);
//更新线程池生命中最大的线程数记录
int s = workers.size();
if (s > largestPoolSize)
largestPoolSize = s;
//设置标记位为true
workerAdded = true;
}
} finally {
mainLock.unlock();
}
//如果刚才成功添加了worker,现在可以开始启动它了
if (workerAdded) {
t.start();
workerStarted = true;
}
}
} finally {
//如果添加失败会回滚创建过程
if (! workerStarted)
addWorkerFailed(w);
}
return workerStarted;
}
final void runWorker(Worker w) {
Thread wt = Thread.currentThread();
//先获取worker的第一个任务,也就是构造它时给它的任务,相当于暂存
Runnable task = w.firstTask;
//获取了以后就将原来worker的第一个任务置为null
w.firstTask = null;
w.unlock(); // allow interrupts
boolean completedAbruptly = true;
try {
//task不为null,不判断后面的,先执行给俺的第一个任务
//俺自己的第一个任务执行完了,才会去获取任务,也就是getTask
while (task != null || (task = getTask()) != null) {
w.lock();
//这些判断直接看doc吧
// If pool is stopping, ensure thread is interrupted;
// if not, ensure thread is not interrupted. This
// requires a recheck in second case to deal with
// shutdownNow race while clearing interrupt
if ((runStateAtLeast(ctl.get(), STOP) ||
(Thread.interrupted() &&
runStateAtLeast(ctl.get(), STOP))) &&
!wt.isInterrupted())
wt.interrupt();
try {
beforeExecute(wt, task);
try {
//废这么大的劲,终于,这个任务它执行了。
task.run();
afterExecute(task, null);
} catch (Throwable ex) {
afterExecute(task, ex);
throw ex;
}
} finally {
task = null;
w.completedTasks++;
w.unlock();
}
}
completedAbruptly = false;
} finally {
//上面while循环跳出后才会执行该方法,否则会进入该方法,下面会有讲解。
processWorkerExit(w, completedAbruptly);
}
}
private Runnable getTask() {
//判断最后一次poll()操作之后是否超时,超时就可能要开始销毁线程
boolean timedOut = false; // Did the last poll() time out?
for (;;) {
int c = ctl.get();
//RUNNING状态直接跳过这个状态判断
// Check if queue empty only if necessary.
if (runStateAtLeast(c, SHUTDOWN)
&& (runStateAtLeast(c, STOP) || workQueue.isEmpty())) {
decrementWorkerCount();
return null;
}
int wc = workerCountOf(c);
//判断当前线程是否可以销毁
//allowCoreThreadTimeOut是线程池的属性,表示是否允许核心线程被销毁
//allowCoreThreadTimeOut(boolean value)可以设置核心线程是否被超时销毁
//timed就是判定是否可以销毁该线程的
// Are workers subject to culling?
boolean timed = allowCoreThreadTimeOut || wc > corePoolSize;
//如果工作线程数大于最大限制,或者已经超时 并且
//工作线程数大于1或者阻塞队列为空
//在以上满足的情况下,用CAS的方式使线程数减1,成功返回null
if ((wc > maximumPoolSize || (timed && timedOut))
&& (wc > 1 || workQueue.isEmpty())) {
if (compareAndDecrementWorkerCount(c))
return null;
continue;
}
//返回阻塞队列里的任务
try {
//设置存活时间来获取
//如果过了这个时间还没有获取到,那么timedOut会为true,下次循环可能要销毁线程了。
Runnable r = timed ?
workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS) :
workQueue.take();
if (r != null)
return r;
timedOut = true;
} catch (InterruptedException retry) {
timedOut = false;
}
}
}
private void processWorkerExit(Worker w, boolean completedAbruptly) {
//判断是否出现异常而中断了线程,如果是则减少一个线程数
if (completedAbruptly) // If abrupt, then workerCount wasn't adjusted
decrementWorkerCount();
final ReentrantLock mainLock = this.mainLock;
//获取主锁,增加完成任务的数量
mainLock.lock();
try {
completedTaskCount += w.completedTasks;
workers.remove(w);
} finally {
mainLock.unlock();
}
//尝试中断本线程
tryTerminate();
int c = ctl.get();
//线程池没有STOP及它之上的状态
if (runStateLessThan(c, STOP)) {
//没有异常结束
if (!completedAbruptly) {
//如果允许核心线程销毁那么min就是0,否则就是核心线程数
int min = allowCoreThreadTimeOut ? 0 : corePoolSize;
//如果min为0但是阻塞队列不空 那么最少需要一个线程
if (min == 0 && ! workQueue.isEmpty())
min = 1;
if (workerCountOf(c) >= min)
return; // replacement not needed
}
//增加一个工作线程
addWorker(null, false);
}
}