찾다

 >  Q&A  >  본문

java线程的join方法源码分析的不解问题

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

天蓬老师天蓬老师2782일 전911

모든 응답(2)나는 대답할 것이다

  • 怪我咯

    怪我咯2017-04-17 18:01:10

    위의 질문에 대한 답변이 완료되었습니다. 스레드가 끝나면 informAll이 호출됩니다.

    JVM의 하위 계층은 실제로 OS 계층에서 제공하는 API를 사용하여 스레드를 지원합니다. 예를 들어 UNIX와 같은 OS는 일반적으로 pthread를 사용합니다(Windows에도 Pthread 구현이 있음). openjdk8 버전. hotspotVM의 기본 코드입니다.

    Thread가 start 메소드를 실행하면 기본 메소드의 start0이 실제로 여러 레이어에 캡슐화되고, 마지막으로 CreateJavaThread 메소드가 호출되어 스레드를 생성합니다. 그것을 실행하십시오.

    대략 다음과 같습니다: Thread.start() -> ... -> pthread_create() => ) -> Thread의 run() 실행 -> detachThread() "이 메서드는 최종적으로 Object.notifyAll을 호출합니다."

    openjdk-8-8u66-b17/jamvm-2.0.0/src/thread.c

    으아악

    회신하다
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 18:01:10

    당신의 추론은 정확해야 합니다. 스레드가 종료되면 자체적인 informAll 메소드를 호출합니다.
    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
  • 취소회신하다