文章目录
- 官方文档对join()的解释:
- 结合实例解释
官方文档对join()的解释:
Thread.join() method javadocs(点击跳转)
join()
Waits for this thread to die.
线程类的
join()
方法将等待子线程完成,然后继续当前线程。join()
看起来像子线程加入主线程。如果你想知道子线程的结果,join()
可以帮助你阻塞主线程直到子线程完成(死亡)。
join()
方法是通过Object
提供的wait()
来实现的。
主线程-->----->----->----->---->--block##########continue--->---->
\ | |
子线程 start()\ | join() |
\ | |
---子线程----->--->--->--->--->完成
结合实例解释
下面的代码中,t1.join()
和t2.join()
的作用是什么?
Thread t1 = new Thread(...);
Thread t2 = new Thread(...);
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
上面示例代码运行在某个线程中,我们默认其为
主线程
在运行,也就是大多数情况。
1 - 主线程创建并且启动
t1
和t2
线程,它们俩开始并行运行
2 - 主线程调用t1.join()
来等待t1
线程执行完毕
3 -t1
线程执行完毕,并且t1.join()
方法在主线程中返回(注意:t1
线程可能在join()
被调用之前就已经执行完毕,此时直接返回)
4 - 主线程调用t2.join()
来等待t2
线程执行完毕
5 -t2
线程执行完毕(可能在t1
线程完成之前执行完毕)t2.join()
在主线程中返回
- 重要的是要理解
t1
和t2
线程一直并行运行
,但是启动它们的主线程
需要等到它们完成才能继续运行。 t1
或t2
可能在主线程调用join()
之前就已经完成了。如果是这样,那么join()
将不会等待,会立即返回。
t1.join()
意味着t2
线程停止直到t1
线程执行完毕吗?
- 不是。调用
t1.join()
的主线程将停止运行并等待t1
线程完成。t2
线程并行运行,完全不受t1
或t1.join()
调用的影响。