1.首先通过源码可以看到join方法的底层逻辑还是使用当前线程对象的wait方法,也知道子线程执行完业务代码后,主线程才能解除阻塞。我认为既然使用的是wait方法,必然需要notify或notifyAll来唤醒,但唤醒的机制是什么?难道使用的线程的隐式钩子方式,当线程执行完后再进行notify?
2.伪代码,按自己的理解实现join方法,不知道这样对不对?
public class JoinTest {
public static void main(String[] args) throws InterruptedException {
ThreadTest tt=new ThreadTest();
tt.start();
synchronized (tt) {
tt.wait();
}
System.out.println("主线程继续。。。。");
}
}
class ThreadTest extends Thread {
public void run() {
for(int i=0;i<5;i++){
try {
Thread.sleep(1000);
System.out.println("i="+i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
//---输出结果输下----
i=0
i=1
i=2
i=3
i=4
主线程继续。。。。
上邊已經回答你的問題,線程結束時會呼叫notifyAll。
JVM底層實際上是使用OS層提供的API來支援線程的,例如UNIX-Like的OS中一般使用pthread(Windows也有Pthread的實作),openjdk的hotspotVM使用的就是pthread,我們來看看openjdk8版本的hotspotVM底層實際代碼。
在Thread執行start的方法時,就會呼叫native方法的start0,start0底層實際經過很多層的封裝,最終會呼叫createJavaThread的方法,createJavaThread就會調pthread_create建立一個執行緒並執行。
過程大致是這樣的:Thread.start() -> start0() -> ... -> createJavaCreate() -> pthread_create() => threadStart() => attachThread() -> 執行Thread的run() -> detachThread() "這個方法最後會呼叫Object.notifyAll"。
openjdk-8-8u66-b17/jamvm-2.0.0/src/thread.c
你的推斷應該是對的,線程死的時候會調用自己的notifyAll方法
As a thread terminates the this.notifyAll method is invoked. It is recommended that applications not use wait, notify, or notifyAll on Thread instances.
java/lang/Thread.java#1258