java
package com.tushang.study.Thread;
public class JoinTest {
public static void main(String[] args) throws InterruptedException {
Thread threadA = new Thread(() -> {
System.out.println("线程A");
});
Thread threadB = new Thread(() -> {
try {
threadA.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程B");
});
Thread threadC = new Thread(() -> {
try {
threadB.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程C");
});
threadB.start();
threadC.start();
// threadA.start();
}
}
输出:
线程B
线程C
原因:
- 对未启动(NEW 状态)的线程调用 join,JVM 会立刻返回,不会阻塞。
- 对已启动但未结束的线程调用 join,会阻塞直到线程结束。
如果把注释去掉,则会固定输出线程A,线程B,线程C

最后的结论:
对未启动(NEW 状态)的线程调用 join,JVM 会立刻返回,不会阻塞,不管是没有start还是执行的时候还没到start(没来的急),都会立刻返回,不会阻塞 。但是对已启动但未结束的线程调用 join,会阻塞直到线程结束。