1.问题描述
1 |
|
1 |
|
输出:
1 |
|
2.查看源码说明
带着这个主线程等待执行的疑惑来一起看下join的源码,如下所示:
1 |
|
谁等待谁终止?源码中注释说明的是等待这个线程终止,那就是等待调用Join()的线程终止,再继续往下看:
1 |
|
从Join的源码中,我们可以看到它使用了while (isAlive()) 循环判断线程的存活状态,满足就调用wait方法,当有设置时长的时候会根据时长来进行等待。注意按照程序的执行顺序,我们这里是主线程调用的Thread的Join方法,所以是判断子线程的存活状态,满足则让子线程执行,主线程来等待。
wait 等待方法是让线程进入等待队列,使用方法是 obj.wait(); 这样当前线程就会暂停运行,并且进入obj的等待队列中,称作“线程正在obj上等待”。可以把子线程t理解为一个普通的obj对象,调用t的wait()方法,实际上就是主线程(main线程)在childThread对象的队列上等待,可以转换为如下写法进一步理解:
1 |
|
输出:
1 |
|
另外需要强调的一点:使用Join方法让主线程等待后,调用完wait方法后,JVM底层会隐式的调用notifyAll方法来唤醒主线程,使其得以继续往下执行。