Last updated on 2025-11-23T20:57:02+08:00
1. TODO
2. 脑图
Xmind
Edraw

Hexo 地址
👉 http://blog.wangjia.ink/2025/11/04/源码:java.util.concurrent.ThreadPoolExecutor.Worker源码解析/
3. 基础部分
3.1. ThreadPoolExecutor.Worker 概述
想象这样一个问题:我们的 Thread 是用来执行一个 Runnable 类型的任务,任务执行完毕后,Thread 就会进入 “死亡” 状态。可是在线程池中,我们希望的是能够复用线程,让它们持续地从任务队列中获取并执行任务
为了解决这一问题,Doug Lea 引入了 Worker 的概念。Worker 本身实现了 Runnable 接口,因此它也是一个 Runnable 类型的任务。我们让 Thread 执行这个 Worker,而在 Worker 的 run 中,使用一个循环不断地从任务队列中获取任务并执行。这样,就 “另辟蹊径” 的实现了 “复用线程”

Worker 是一个具体类,是 java.util.concurrent.ThreadPoolExecutor 的成员内部类,继承了 java.util.concurrent.locks.AbstractQueuedSynchronizer,实现了 java.lang.Runnable
Worker 是使用 AQS 实现的状态机,State 表示以下含义:
-1
Worker 正在被实例化
0
Worker 并没有 “执行” 任务(正在从任务队列中获取任务)
1
Worker 正在 “执行” 任务
4. 源码部分
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| private final class Worker extends AbstractQueuedSynchronizer implements Runnable { @SuppressWarnings("serial") final Thread thread; @SuppressWarnings("serial") Runnable firstTask; volatile long completedTasks; Worker(Runnable firstTask) { setState(-1); 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() { release(1); } public boolean isLocked() { return isHeldExclusively(); } void interruptIfStarted() { Thread t; if (getState() >= 0 && (t = thread) != null && !t.isInterrupted()) { try { t.interrupt(); } catch (SecurityException ignore) { } } } }
|