2012-01-11 90 views
4

在線程2上由線程1調用時,wait()和join()方法都會使線程1等待線程2,有時候或者直到線程2完成。wait(long timeout)和join(long millis)之間的區別?

如果我們使用這些方法的重載版本,即等待(長期超時)和join(long millis)來,然後

  1. 在等待(長期超時)的情況下,線程1將成爲可運行通過通知(或通知)或甚至發生超時(以先到者爲準)。

  2. 在連接(long millis)的情況下,當線程2完成或發生超時(以先發生者爲準)時,線程2將變爲可運行的。

那麼這兩個實現有什麼區別?我認爲

有些是這些: -

  1. 對於wait()的,我們需要有我們正在等待在對象上的鎖。對於join(),這些不是必需的。
  2. 執行wait()後,線程會移除它獲得的鎖,並在鎖再次運行後重新獲得鎖。但加入怎麼辦?如果線程是從同步塊(或方法)執行的,執行連接後線程是否刪除鎖定?
+3

答案在問題中。等待塊,直到通知調用線程。連接塊直到連接的線程完成。沒有涉及加入的鎖定。 – 2012-01-11 11:54:40

回答

6

正如你所說,「發佈」過程是非常不同的 - 在基於notify()的情況下,另一個則基於線程完成。他們完全不同的電話服務完全不同的目的。

事實上,有明確的警告來調用Thread顯示器wait()(雖然我不能馬上找到這些警告),內部的Java代碼獲取用於他們的鎖(並使用wait/notify本身)。

但沒有,呼籲Threadjoin()釋放監視器,如果當前執行的線程擁有它。

基本上,你不應該認爲它們完全相似 - 一個是等待線程終止;另一個是等待合作協調。

相關問題