Java线程池execute方法源码及注释
/**
* 执行任务的方法
*/
public void execute(Runnable command) {
// 如果command为空,将抛出NullPointerException
if (command == null)
throw new NullPointerException();
/*
* 处理过程分为以下3步骤:
*
* 1. 如果线程池内的线程数小于corePoolSize,
* 则创建新的核心线程执行任务,参数command将会作为
* 这个新线程的第一个执行的任务。否则进入步骤2.
*
* 2. 如果任务可以成功进入阻塞队列,重新检查线程池的状态。
* 如果线程池已经停止了,则将刚刚入队的任务做出队处理。
* 如果线程池内没有线程了,则创建一个新的线程。
*
* 3. 如果任务入队失败,则创建一个新的非核心线程。
* 如果创建非核心线程失败了,则线程池可能已经关闭或饱和,
* 因此需要拒绝这个任务。
*/
// 获取ctl对应的int值
int c = ctl.get();
// workerCountOf方法获取工作线程数
// 如果工作线程数小于corePoolSize
if (workerCountOf(c) < corePoolSize) {
// addWorker方法创建新的线程
// 参数core:true-核心线程 false-非核心线程
// 如果addWorker方法创建新的核心线程成功
if (addWorker(command, true))
// 创建核心线程成功后,方法结束
return;
// 如果addWorker方法创建新的核心线程失败
// 重新获取ctl的int值(因为线程池状态可能已被修改)
c = ctl.get();
}
// isRunning方法判断线程池处于RUNNING状态
// offer方法将任务入队(阻塞队列中讲过的方法)
// 如果线程池处于RUNNING状态且任务入队成功
if (isRunning(c) && workQueue.offer(command)) {
// 再次获取ctl的int值
// 任务入队的过程中线程池状态可能已被修改
int recheck = ctl.get();
// 如果线程池并非处于RUNNING状态
// 并且成功删除刚刚入队的任务
if (! isRunning(recheck) && remove(command))
// 则执行reject方法,拒绝此次提交的任务
reject(command);
// 如果工作线程数为0
else if (workerCountOf(recheck) == 0)
// 进入这里有几种情况:
// 1.线程池处于RUNNING状态,但工作线程数为0
//(可能执行的corePoolSize=0会触发此种场景)
// 2.线程池处于非RUNNING状态,
// 但是任务从阻塞队列删除失败,此时工作线程数为0
// 创建新的非核心线程
addWorker(null, false);
}
// 如果线程池处于非RUNNING状态
// 或者线程池处于RUNNING状态,但任务入阻塞队列失败
// 尝试通过addWorker方法创建一个非核心线程
// 如果addWorker方法创建非核心线程成功,则方法结束
// 如果addWorker方法创建非核心线程失败,则执行reject方法
else if (!addWorker(command, false))
reject(command);
}
Java线程池addWorker方法源码及注释
/*
* 创建新的工作线程到线程池中
*/
private boolean addWorker(Runnable firstTask, boolean core) {
// 外层循环标记
retry:
// 自旋操作开始
for (;;) {
// 获取ctl对应的int值
int c = ctl.get();
// 获取线程池的运行状态
int rs = runStateOf(c);
// 线程池的状态为以下几种
// SHUTDOWN/STOP/TIDYING/TERMINATED
// 或者线程池的状态不为SHUTDOWN,
// 或者firstTask不等于空
// 或者队列为空的时候
// 返回false
if (rs >= SHUTDOWN &&
! (rs == SHUTDOWN &&
firstTask == null &&
! workQueue.isEmpty()))
// 添加工作线程失败
return false;
// 自旋
for (;;) {
// 获取工作线程数
int wc = workerCountOf(c);
// 如果工作线程数大于CAPACITY
// 或者创建的是核心线程且工作线程数>=corePoolSize
// 或者创建的是非核心线程且工作线程数>=maximumPoolSize
if (wc >= CAPACITY ||
wc >= (core ? corePoolSize : maximumPoolSize))
// 添加工作线程失败
return false;
// CAS自增工作线程数
// 如果成功则跳出最外层循环
if (compareAndIncrementWorkerCount(c))
break retry;
// 重新读取ctl的值
c = ctl.get(); // Re-read ctl
// 如果内层循环获取到的线程池工作状态
// 不等于外层循环的工作状态
//(在执行内层循环的时候,状态被修改)
if (runStateOf(c) != rs)
// 进入下一次内层循环
continue retry;
// else CAS failed due to workerCount change; retry inner loop
}
}
// 标记工作线程是否被启动
boolean workerStarted = false;
// 标记工作线程是否被添加成功
boolean workerAdded = false;
// 工作线程
Worker w = null;
try {
// 创建一个新的工作线程
w = new Worker(firstTask);
// 获取工作线程的thread属性
final Thread t = w.thread;
// 如果t非空
if (t != null) {
// 加可重入锁
final ReentrantLock mainLock = this.mainLock;
// 加锁
mainLock.lock();
try {
// 获取线程池的工作状态
int rs = runStateOf(ctl.get());
// rs < SHUTDOWN:RUNNING
// rs == SHUTDOWN且firstTask为空
if (rs < SHUTDOWN ||
(rs == SHUTDOWN && firstTask == null)) {
// 线程状态校验
if (t.isAlive()) // precheck that t is startable
throw new IllegalThreadStateException();
// 工作线程的HashSet中添加此工作线程
workers.add(w);
// 工作线程数
int s = workers.size();
// 如果工作线程数大于largestPoolSize
if (s > largestPoolSize)
// 设置largestPoolSize为s
largestPoolSize = s;
// 设置workerAdded为true
workerAdded = true;
}
} finally {
// 解锁
mainLock.unlock();
}
// 如果workerAdded为true
if (workerAdded) {
// 启动线程t
t.start();
// 设置workerStarted为true
workerStarted = true;
}
}
} finally {
// 如果workerStarted为false即工作线程启动失败
if (! workerStarted)
// 删除此工作线程
addWorkerFailed(w);
}
// 返回工作线程启动结果workerStarted
return workerStarted;
}
这两个知识点大家弄懂了吗?
公众号
扫描下面二维码关注我们的公众号“云析学院”,了解更多技术性资料。