2012-07-15 78 views
5

考慮下面的代碼:Thread類的join()方法如何工作?

class ThreadJoinTest{ 
    public static void main(String[] arguments){ 
     TimeUnit unit; 
     final Thread taskThread = new Thread(task); 
     taskThread.start(); 
     taskThread.join(unit.millis(timeout)); 
    } 
} 

所以當主線程將與超時值,主線程給taskThread充足的時間來完成它的任務執行線taskThread.join()?這是連接方法的主要目標嗎?

如果會發生什麼:

  1. taskThread的超時期限之前完成它的執行?
  2. 如果達到超時但taskThread尚未執行完成會發生什麼情況? taskThread是否有機會完成任務?
  3. 主線程如何知道由於taskThread正常完成或達到超時而返回連接?

回答

5
  1. main將被允許儘快重新開始爲taskThread是 做起來難。
  2. Then main將被允許再次啓動,並且taskThread將繼續。兩個線程都將被允許完成。
  3. 如果taskThread正常結束或達到超時,main將繼續執行。 main無法知道超時是否發生,或者如果不使用某些其他通信方式完成執行,則main無法知道。
+0

我認爲你的答案回答了前兩個問題,但不是第三個問題。由於從聯接返回的類型爲void主線程如何知道線程taskThread是否正常完成或由於超時? – Geek 2012-07-15 16:04:00

+0

@Geek:增加了一些信息。 – Keppil 2012-07-15 16:12:19

+0

所以這是設計中的一個缺陷..你覺得怎麼樣? – Geek 2012-07-15 16:23:40

4

join()稱爲線程時,將等待線程死亡(即該線程的run方法獲得與..做),那麼只有join()下面的命令將會執行。 但是,在join()中給出一個超時,會使特定的超時後,join()效果無效。

雖然發生超時,taskThread將被允許完成工作。

+0

因此,假設發生超時並且taskThread尚未完成,taskThread是否因爲超時而死亡? – Geek 2012-07-15 15:58:20

+0

不,即使超時發生後,taskhTread將被允許完成其工作 – 2012-07-15 16:02:05

+0

行得通。最後一個問題呢?也請看我對凱比爾的回答的評論。 – Geek 2012-07-15 16:06:12

1

超時條件優先。當達到超時時,主線程和taskThread同樣可能被執行。