2014-03-19 29 views
6

我想知道Java如何实现join()方法来等待线程完成。按照source codeJDK实现Thread.join()

public final synchronized void [More ...] join(long millis) 
throws InterruptedException { 
    long base = System.currentTimeMillis(); 
    long now = 0; 

    if (millis < 0) { 
     throw new IllegalArgumentException("timeout value is negative"); 
    } 

    if (millis == 0) { 
     while (isAlive()) { 
      wait(0); 
     } 

    } else { 
     while (isAlive()) { 
      long delay = millis - now; 
      if (delay <= 0) { 
       break; 
      } 
      wait(delay); 
      now = System.currentTimeMillis() - base; 
     } 
    } 
} 

调用线程获得运行的线程的监控和wait()在行1160无限期同时运行的线程仍然活着。

我的问题是:当线程完成时,哪里(和谁调用)notify()或notifyAll(),以便唤醒调用线程?

为了清楚起见,问题是关于,在JDK/JVM中notify()被调用,而不是在我们的代码中。

谢谢。

+2

它是JDK的线程实现的一部分。当'run'返回时,它相当于调用'notifyAll'。 –

+0

它被称为本地代码中的某处(用C++编写) –

回答

6

notifyAll(或其本地等价物)在当前版本的第1526行的src/share/vm/runtime/thread.cpp的ensure_join中调用,该函数在同一文件中从JavaThread :: exit调用。