2012-04-28 47 views
0

我明白wait()notify()/notifyAll()方法用於替換在其他語言中使用的傳統的循環/輪詢結構的目的:如何等待/通知和條件管理線程

while(true) { 
    if(pollSomethingForAnEvent()) 
     break; 
} 

我進一步明白Condition API是在Java 5中引入以在更「OO」的實現中包裝這個模型。

不明白就是Java怎麼知道哪個線程通知時Object.notify()Condition.signal()叫,不然怎麼知道的Java與Object.wait()Condition.await()到信號,線程被稱爲?

由於這些方法不需要任何參數,因此JVM如何知道哪些線程將這些通知傳遞給?!?!

+1

一般來說,如果只有一個線程被喚醒,它會先到先服務。也就是說,第一個執行wait命令的線程是第一個被通知的。 – jpm 2012-04-28 15:53:31

回答

2

對於每個Condition或同步的對象,JVM維護一個等待對象的隊列。它還具有運行隊列和其他數據結構,用於維護和管理Thread運行狀態。

當調用Object.notify()時,它只查找與該對象關聯的隊列,將第一個Thread移到那裏並將其移動到運行隊列中。如果隊列爲空,則不通知線程。如果notifyAll()被調用,則在該對象上等待的所有線程都被髮送信號。

不是使問題複雜化,但有一點是必須認識到的是,當一個Thread調用lockObject.wait()通知,它從一個等待狀態移動到運行隊列的年底等待獲得訪問鎖在lockObject。它不會立即開始運行。