一.概述
join() 的作用是让别的线程在自己之前执行
假设线程A必须要在线程B之后执行,则可以在线程A中调用B.join(),则线程A将一直等待/阻塞,直到线程B运行完。
二.源码
简化版的源码如下:
public final synchronized void join(final long millis)
throws InterruptedException{
while (isAlive()) {
wait(0);
}
}
首先一个很直观的感受是,join() 实质是通过wait() 来实现的。假设A进程中调用了B进程的join()方法,由于join是synchronized方法,所以A进程获取了B进程的锁。随后调用了wait方法,从而自身陷入无限期等待。
当一个线程执行完时,系统会调用它的exit()方法,并在其中执行notifyAll()。所以当线程B运行完的时候会唤醒线程A。
while(isAlive())的作用:
isAlive()是一个native方法,它可以判断一个线程是否活着:
- 假如一个线程被new出来,但还没有通过start()方法启动则不算活着
- 当一个线程执行完时,自然就不算活着了
因此while(isAlive())是为了保证只在线程B“启动且没终止”的情况下才执行wait()方法,如果直接执行wait()方法,假如线程B一直没被启动则A也将无限期地等下去。
为什么不用 if 而是 while 来判断,因为不能只判断一次,而是要一直判断直到B进程启动。