Java 并发编程的艺术第2版学习笔记
原书:《Java 并发编程的艺术第2版》 | 作者:方腾飞 魏鹏 程晓明 | 2023 年 9 月 | 机械工业出版社
1.3.5 thread.join() 的使用 | 20 页
执行 thread.join()
方法的线程会等待当前线程终止之后,才从 thread.join()
返回。
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
| public class Join {
public static void main(String[] args) {
Thread previous = Thread.currentThread();
for (int i = 0; i < 10; i++) {
Thread thread = new Thread(new Domino(previous), String.valueOf(i));
thread.start();
previous = thread;
}
}
static class Domino implements Runnable {
private Thread thread;
public Domino(Thread thread) {
this.thread = thread;
}
@Override
public void run() {
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " terminate.");
}
}
}
|
输出:
1
2
3
4
5
6
7
8
9
10
| 0 terminate.
1 terminate.
2 terminate.
3 terminate.
4 terminate.
5 terminate.
6 terminate.
7 terminate.
8 terminate.
9 terminate.
|
JDK 源码中 join()
方法使用了 wait()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| public final synchronized void join(final long millis)
throws InterruptedException {
if (millis > 0) {
if (isAlive()) {
final long startTime = System.nanoTime();
long delay = millis;
do {
wait(delay);
} while (isAlive() && (delay = millis -
TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startTime)) > 0);
}
} else if (millis == 0) {
while (isAlive()) {
wait(0);
}
} else {
throw new IllegalArgumentException("timeout value is negative");
}
}
|
当线程终止时,调用线程自身的 notifyAll() 方法,以便通知所有等待在该线程对象上的线程。
AI 补充
当线程终止时,JVM 会调用线程对象的 notifyAll() 方法,以便通知所有等待在该线程对象上的线程。这部分操作是在线程结束时自动执行的,而不需要程序员显式编写调用代码。