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