execute源码
/**
* 执行任务的方法
*/
public void execute(Runnable command) {
//如果command为空,将抛出NullPointerException
if (command == null)
throw new NullPointerException();
/*
* 处理过程分为以下三个部分:
*
* 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
//2.线程池处于非RUNNING状态,但是任务从阻塞队列删除失败,
//此时工作线程数为0
//创建新的非核心线程
addWorker(null, false);
}
//线程池处于非RUNNING状态
//或者线程池处于RUNNING状态,但任务入阻塞队列失败
//尝试通过addWorker方法创建一个非核心线程
//如果addWorker方法创建非核心线程成功,则方法结束
//如果addWorker方法创建非核心线程失败,则执行reject方法
else if (!addWorker(command, false))
reject(command);
}
execute方法流程图
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
//或者fiestTask不等于空
//或者队列为空
//返回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());
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();
}
if (workerAdded) {
//启动线程
t.start();
//设置workerStarted为true
workerStarted = true;
}
}
} finally {
//如果workerStarted为false即工作线程启动失败
if (! workerStarted)
//删除此工作线程
addWorkerFailed(w);
}
//返回工作线程启动结果workerStarted
return workerStarted;
}