join()方法使当前线程暂停执行,直至目标线程运行结束;需在目标线程start()后调用,是实例方法且会抛出InterruptedException;支持超时等待和多个线程依次join。

Java 中 join() 方法的作用就是让当前线程(比如主线程)**暂停执行,直到调用 join() 的那个线程(子线程)运行结束**。这是最直接、最标准的等待子线程完成的方式。
基本用法:调用子线程的 join() 就行
你只需要在启动子线程后,立刻对它调用 join()。主线程就会在此处阻塞,等子线程 run() 方法执行完再继续。
- 子线程必须已调用
start(),否则join()会立即返回(因为线程还没开始) -
join()是实例方法,只能由其他线程调用,不能在自己线程里调自己 - 它会抛出
InterruptedException,需要处理或声明
示例:
Thread t = new Thread(() -> {
System.out.println("子线程开始");
try { Thread.sleep(2000); } catch (InterruptedException e) {}
System.out.println("子线程结束");
});
t.start();
t.join(); // 主线程在这里等 t 执行完
System.out.println("主线程继续执行");
带超时的 join:避免无限等待
如果担心子线程卡死或耗时过长,可以用带毫秒参数的 join(long millis)。
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 最多等待指定毫秒数,时间到就继续执行,不管子线程是否结束
- 也可以用
join(long millis, int nanos)支持纳秒级精度(一般用不到) - 超时后可通过
t.isAlive()判断子线程是否还在运行
多个子线程?挨个 join 就行
如果有多个子线程,想等它们全部执行完,就对每个都调一次 join() —— 顺序不重要,但必须在它们 start() 之后调用。
- 推荐先全部
start(),再统一join(),避免串行启动导致总耗时变长 - 例如:启动 t1、t2、t3 后,再依次 t1.join()、t2.join()、t3.join()
注意:join 不是同步锁,也不影响子线程逻辑
join() 只是让调用方等待,并不会加锁、不会中断子线程、也不会改变子线程的执行内容或调度优先级。
- 子线程仍按自己的节奏运行,主线程只是“原地休息”直到它结束
- 如果子线程内部有死循环或阻塞未处理,主线程就会一直等下去(除非用了超时版)
- 和
synchronized或Lock完全无关,别混淆
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










