源码:java.util.concurrent.ThreadPoolExecutor.Worker 源码解析

1. TODO


2. 脑图

  1. Xmind

  2. Edraw

  3. 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,而在 Workerrun 中,使用一个循环不断地从任务队列中获取任务并执行。这样,就 “另辟蹊径” 的实现了 “复用线程”

Worker 是一个具体类,是 java.util.concurrent.ThreadPoolExecutor 的成员内部类,继承了 java.util.concurrent.locks.AbstractQueuedSynchronizer,实现了 java.lang.Runnable

Worker 是使用 AQS 实现的状态机,State 表示以下含义:

  1. -1
    1. Worker 正在被实例化
  2. 0
    1. Worker 并没有 “执行” 任务(正在从任务队列中获取任务)
  3. 1
    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 {

// 表示 Worker 封装的 Thread 实例
//
// 该 Thread 实例负责执行 Worker#run,并且是在 Worker 被实例化的时候被实例化的
@SuppressWarnings("serial")
final Thread thread;

// 表示 Worker 的 “启动任务”
@SuppressWarnings("serial")
Runnable firstTask;

// 表示 Worker 已完成任务的任务数量
volatile long completedTasks;

Worker(Runnable firstTask) {
setState(-1);
this.firstTask = firstTask;
this.thread = getThreadFactory().newThread(this);
}

public void run() {
// 调用 ThreadPoolExecutor#runWorker,并把 this 作为方法参数传递进去
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) {
}
}
}

}


源码:java.util.concurrent.ThreadPoolExecutor.Worker 源码解析
https://wangjia5289.github.io/2025/11/04/源码:java.util.concurrent.ThreadPoolExecutor.Worker源码解析/
Author
咸阳猴🐒
Posted on
November 4, 2025
Licensed under