该文章介绍了worker类,即是线程池的工作线程,讨论了该类的一些特性。
Worker继承AQS抽象类,继承AQS可以获得互斥访问的能力,我们在ThreadPoolExecutor会看到runWorker和interruptIdleWorkers中存在w.lock()的操作,原因是为了防止对正在运行的线程造成影响。由于运行状态的线程处于加锁状态,所以可以通过tryLock判断线程处于空闲还是运行。
实现Runnable,run中运行的时runWorker逻辑。
private final class Worker
extends AbstractQueuedSynchronizer
implements Runnable{
private static final long serialVersionUID = 6138294804551838833L;
// 工作线程
final Thread thread;
// 初始任务,只在worker第一次执行任务的时候执行,之后都是从workQueue中获取任务执行
Runnable firstTask;
//计算完成的任务
volatile long completedTasks;
Worker(Runnable firstTask) {
setState(-1); // 禁止interrupt直到runWorker
this.firstTask = firstTask;
this.thread = getThreadFactory().newThread(this);
}
public void run() {
runWorker(this);
}
protected boolean isHeldExclusively() {
return getState() != 0;
}
protected boolean tryAcquire(int unused) {
if (compareAndSetState(0, 1)) {
setExclusiveOwnerThread(Thread.currentThread());
return true;
}
return false;
}
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() { (1); }
public boolean isLocked() { return isHeldExclusively(); }
void interruptIfStarted() {
Thread t;
if (getState() >= 0 && (t = thread) != null && !t.isInterrupted()) {
try {
t.interrupt();
} catch (SecurityException ignore) {
}
}
}
}
源码阅读 - 线程池:线程池原理(一)线程池概述
源码阅读 - 线程池: 线程池原理(二)线程池构造函数解析
源码阅读 - 线程池:线程池原理(三)线程池的状态解析
源码阅读 - 线程池:线程池原理(四)addWorker–execute方法的前奏
源码阅读 - 线程池:线程池原理(五)一个execute(Runnable)调用经历了什么?
源码阅读 - 线程池:线程池原理(六)线程的任务调度和执行runWoker
源码阅读 - 线程池:线程池原理(七)线程池的关闭
源码阅读 - 线程池:线程池原理(八)ThreadPoolExecutor
源码阅读 -线程池:线程池原理(九)相关接口介绍
源码阅读 - 线程池:线程池原理(十)Worker内部类