[英]How wait/notify and Condition manage threads
我知道wait()
和notify()/notifyAll()
方法的目的是替換其他語言中使用的傳統循環/輪詢結構:
while(true) {
if(pollSomethingForAnEvent())
break;
}
我進一步理解Condition
API是在Java 5中引入的,用於將此模型包裝在更“OO”的實現中。
我不明白的是,當Object.notify()
或Condition.signal()
時,Java如何知道要通知哪些線程,或者Java如何知道使用Object.wait()
或Condition.await()
發出哪些線程信號?叫什么名字?
由於這些方法不會將任何內容作為參數,因此JVM如何知道將這些通知傳遞給哪些線程?!?!
對於每個Condition
或synchronized對象,JVM維護一個等待它們的對象隊列。 它還具有運行隊列和其他數據結構,用於維護和管理Thread
運行狀態。
當Object.notify()
,它只是在與該對象關聯的隊列中查找第一個Thread
並將其移動到運行隊列。 如果隊列為空,則不通知任何線程。 如果調用notifyAll()
,則會發出等待該對象的所有線程的信號。
不要使問題復雜化,但有一點需要注意的是,當一個調用了lockObject.wait()
的Thread
被通知時,它會從等待狀態轉移到運行隊列的末尾 ,等待訪問lockObject
上的鎖。 。 它不會立即開始運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.