2012-02-09 56 views
7

這純粹是一個理論問題,因爲我不確定引起此問題的條件是否會很常見。如何在Join()被調用之前停止線程返回

比方說你有,你踢掉它線程的啓動方法:直接後

Thread c = new Thread(); 
c.start(); 

然後,調用線程上的join()方法來告訴你在等待的方法直到線程被執行繼續。

c.join(); 

這難道不是一種可能性,即線程可能被執行和完成的連接方法被調用之前,因此離開該方法不知道它必須等待C到完成它繼續之前?我想你可以在調用start()方法之前嘗試調用join()方法,但是無論何時在測試用例中嘗試過,都會出現錯誤。

任何人都知道可能的解決方案,或者JVM如何處理它?正如我所說我沒有能夠觸發這種情況,但理論上有可能...

+0

爲什麼它是一個問題? – 2012-02-09 15:12:07

+0

在別人認爲的答案中,推斷任何其他線程上的join()僅僅是調用線程的標準檢查都不會有錯。 – soufrk 2017-07-16 07:41:05

回答

10

根據Thread#join(long millis)源代碼,isAlive()方法用於檢查線程狀態。

/** 
* Tests if this thread is alive. A thread is alive if it has 
* been started and has not yet died. 
* 
* @return <code>true</code> if this thread is alive; 
*   <code>false</code> otherwise. 
*/ 
public final native boolean isAlive(); 

如果線程完成這個方法顯然返回false,所以thread.join()將立即退出。

0

連接方法語義意味着「要等到連接線程完成」,並且這幾乎是支持多線程的每種編程語言的標準。因此,加入一個已經完成的線程是完全可能的,JVM只會檢測到它已經完成並繼續執行代碼。

6

c.join()表示當前正在執行的線程在完成前應該等待c完成。如果c在撥打c.join()之前執行完畢,則滿足該條件,因爲c已完成執行。你打電話給c.join()的方法不會「知道它」。 c.join()就像是一個沒有操作。

0

如果線程沒有運行,join()將立即返回。

2

您可以在線程啓動之前調用join(),但由於線程尚未啓動,join()將立即返回。

如果join()在線程啓動後調用,並且線程已終止,則join()也將立即返回。

唯一一次join()將塊而Thread.isAlive()

此代碼行...

public static void main(String[] args) throws InterruptedException 
    { 
     Thread t = new Thread(new Runnable() 
     { 
     public void run() 
     { 
      System.out.println("thread"); 
     } 
     }); 
     t.join(); 
     System.out.println("joined"); 

     Thread.sleep(2000); 
     System.out.println("call start"); 
     t.start(); 
    } 
相關問題