一切都在源码中
final void runWorker(Worker w) {
// 获取当前线程对象的引用
Thread wt = Thread.currentThread();
// 获取worker的firstTask
Runnable task = w.firstTask;
// 获取完之后把worker的firstTask置为null 防止下次获取到
w.firstTask = null;
// 初始化worker的state = 0, exclusiveOwnerThread = null 解锁
w.unlock();
// 如果发生异常 当前线程突然退出 该值为true
boolean completedAbruptly = true;
try {
// 如果firstTask获取getTask能获取到任务 则进行内层逻辑, 如果getTask返回null则循环退出了就要
while (task != null || (task = getTask()) != null) {
/*
* worker设置独占锁
* shutdown 时会判断当前worker的状态,根据独占锁的状态来判断worker是否在处理任务是否工作
*/
w.lock();
/*
* 3个判断
* 1、runStateAtLeast(ctl.get(), STOP)为真说明当前状态大于等于STOP 此时需要给他一个中断信号
* 2、wt.isInterrupted()查看当前是否设置中断状态如果为false则说明为设置中断状态
* 3、Thread.interrupted() && runStateAtLeast(ctl.get(), STOP) 获取当前中断状态且清除中断状态
* 这个判断为真的话说明当前被设置了中断状态(有可能是线程池执行的业务代码设置的,然后重置了)且当前状态变成了大于等于STOP的状态了
*
* 整个判断为真的两种情况
* 1、如果当前线程大于等于STOP 且未设置中断状态 整个判断为true 第一个runStateAtLeast(ctl.get(), STOP)为true !wt.isInterrupted()为true
* 2、第一次判断的时候不大于STOP 且当前设置了中断状态(Thread.interrupted()把中断状态又刷新了) 且设置完了之后线程池状态大于等于STOP了
* Thread.interrupted() && runStateAtLeast(ctl.get(), STOP) 为true !wt.isInterrupted()为true
*
* 结合if判断里面的代码来看
* 也就是说如果线程池状态大于等于STOP则设置当前线程的中断状态
* 如果线程池状态小于STOP则清除中断状态
*/
if ((runStateAtLeast(ctl.get(), STOP) ||
(Thread.interrupted() && runStateAtLeast(ctl.get(), STOP)))
&& !wt.isInterrupted())
// 设置中断状态
wt.interrupt();
try {
// 钩子方法留给子类实现
beforeExecute(wt, task);
try {
// task可能是FutureTask或者普通Runnable/Callable接口实现类
task.run();
// 钩子方法 留给子类实现
afterExecute(task, null);
} catch (Throwable ex) {
afterExecute(task, ex);
throw ex;
}
} finally {
// 局部task设置为null
task = null;
// 完成数量加1
w.completedTasks++;
// 使用unlock 释放独占锁
w.unlock();
}
}
// getTask的返回为null 会走到这行 表示这次不是异常退出
completedAbruptly = false;
} finally {
/*
* 执行线程退出逻辑
* 如果completedAbruptly是true说明是task.run()方法有异常 先catch后又抛了出来 在执行完了w.unlock();走到了这里
* 如果是false则说明是拿不到任务走到了这里
*/
processWorkerExit(w, completedAbruptly);
}
}