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 系の OS は一般に pthread を使用します (Windows にも Pthread 実装があります)。 openjdk8 のバージョン。hotspotVM の基礎となる実際のコード。
Thread が start メソッドを実行すると、ネイティブ メソッドの start0 が呼び出され、start0 の最下層は実際には多くの層にカプセル化され、最後に createJavaThread メソッドが呼び出されて pthread_create が呼び出され、スレッドが作成されます。それを実行します。
プロセスは次のようになります: Thread.start() -> start0() -> createJavaCreate() => ) -> スレッドの run() を実行 -> detachThread() "このメソッドは最終的に Object.notifyAll を呼び出します。"
openjdk-8-8u66-b17/jamvm-2.0.0/src/thread.c
リーリーあなたの推論は正しいはずです。スレッドが終了すると、スレッドは独自の notificationAll メソッド
を呼び出します。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