java中join()方法的作用是让当前线程暂停执行,直到调用join()的子线程运行结束;它基于wait()实现,支持超时等待,需在子线程start()后调用,且仅对已启动线程有效。

Java 中 join() 方法的作用就是让当前线程(比如主线程)**暂停执行,直到调用 join() 的那个子线程运行结束**。它本质上是线程间的一种同步等待机制。
join 的基本用法
假设你启动了一个子线程 t,想让主线程等它执行完再继续,只需在 t.start() 之后调用 t.join():
-
t.start()启动子线程 -
t.join()阻塞当前线程(这里是主线程),直到t执行完毕(即run()方法返回)
示例代码:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
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) 或 join(long millis, int nanos):
-
t.join(3000):最多等 3 秒,超时后主线程自动恢复执行 - 若子线程在超时前结束,主线程立即继续;若超时仍未结束,主线程也不再等待
- 注意:超时后子线程仍在后台运行,
join不会中断它
多个子线程的等待顺序
若启动了多个子线程,需对每个都调用 join() 才能确保全部完成:
- 按调用顺序等待:先
t1.join(),再t2.join(),主线程会先等t1完、再等t2完 - 若想“并行等待”(即同时等所有子线程结束),可把
join()放在循环里,但仍是串行阻塞调用——这是 Java 的设计限制,如需更灵活的协调,建议改用CountDownLatch或CompletableFuture
join 的底层原理与注意事项
join() 内部其实是用 wait() 实现的,所以它要求调用线程必须持有目标线程对象的锁(JVM 自动处理,无需手动 synchronized)。使用时注意:
- 只能对已启动(
start())的线程调用join();对未启动或已终止的线程调用,会立即返回 - 调用
join()的线程被阻塞期间,仍处于WAITING或TIMED_WAITING状态,不是死锁 - 若主线程在
join()期间被中断,会抛出InterruptedException,需捕获并处理(例如恢复中断状态)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










