源码阅读 - 线程池:线程池原理(十)Worker内部类
该文章介绍了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) { } } } }