分享系列——Thread#join() 在 Java 源码中并没有 notify ,被阻塞线程是如何唤醒的?答案在 JVM

前几天看了一道面试题,如何控制线程执行顺序。答案是 Thread#join()。

看了 join() 源码,有点疑惑,无参的 join() 会调用 Thread#wait(0); 这是一个无限阻塞的方法。并且 wait(0) 还是在 while 循环中,防止假唤醒。那么就保证一直沉睡了。

谁来调用 notify() / notifyAll() ??? 通过执行代码从结果反推,我们知道肯定在某处执行了唤醒。

于是今天想起来搜了一下,果然网上有人分析了 join() 源码,而且找到了唤醒的方法是在 JVM 底层。时机是在被调用 join 的线程死亡之前,调用自身 notifyAll() 唤醒所有在该线程上等待的其他线程。

文章链接:https://blog.csdn.net/u010983881/article/details/80257703

原文地址:https://www.cnblogs.com/christmad/p/11595462.html