java线程的join方法源码分析的不解问题
天蓬老师
天蓬老师 2017-04-17 17:59:10
0
2
908

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
主线程继续。。。。

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全員に返信(2)
刘奇

あなたの質問は上記で解決されました。スレッドが終了すると、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

リーリー
いいねを押す +0
伊谢尔伦

あなたの推論は正しいはずです。スレッドが終了すると、スレッドは独自の 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

を呼び出します。
いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート