java中join()方法使主线程阻塞等待指定子线程执行完毕,是简单直接的线程同步方式;支持无参阻塞、带毫秒/纳秒超时等待,并需在已start()的线程上调用,多个线程可依次join确保全部完成。

Java 中用 join() 方法可以让主线程暂停执行,直到指定的子线程运行结束。这是最直接、最常用的线程同步方式之一,不需要额外加锁或使用复杂工具类。
join 的基本用法
调用某个线程对象的 join() 方法,当前线程(比如主线程)就会阻塞,等待该线程执行完 run() 方法后再继续往下走。
- 子线程启动后,主线程调用
thread.join()即可等待它结束 -
join()是实例方法,必须在已启动(start())的线程上调用,对未启动或已结束的线程调用不会报错,但可能立即返回 - 如果子线程已经结束,
join()会立刻返回,不阻塞
带超时的 join
有时不能无限等待,可以用带时间参数的 join(long millis) 或 join(long millis, int nanos) 设置最大等待时长。
- 例如
t.join(5000)表示最多等 5 秒;超时后主线程继续执行,不管子线程是否结束 - 超时后可通过
t.isAlive()判断子线程是否还在运行 - 注意:超时单位是毫秒,不是秒
多个子线程的等待顺序
如果有多个子线程,需要逐个调用 join(),顺序取决于你想等待的逻辑:
- 按启动顺序等待:
t1.start(); t2.start(); t1.join(); t2.join(); - 想等全部完成再继续,就每个都
join(),顺序不影响最终结果(但建议按启动顺序或变量顺序调用,便于理解) - 不要在子线程里调用自身
join(),会导致死锁
实际写法示例
以下是一个典型场景:主线程启动两个子线程处理任务,等它们都完成后打印汇总结果。
Thread t1 = new Thread(() -> {
System.out.println("子线程1开始");
try { Thread.sleep(1000); } catch (InterruptedException e) {}
System.out.println("子线程1结束");
});
Thread t2 = new Thread(() -> {
System.out.println("子线程2开始");
try { Thread.sleep(1500); } catch (InterruptedException e) {}
System.out.println("子线程2结束");
});
t1.start();
t2.start();
try {
t1.join(); // 主线程等t1
t2.join(); // 再等t2
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
System.out.println("所有子线程已完成"); // 这行一定最后输出
不复杂但容易忽略细节,关键是确保线程已 start(),再 join(),并妥善处理中断异常。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











