我想擁有一個位於事件隊列頂部的線程並對其做出相應反應。我的想法是清除所有元素,一旦到達隊列尾部,請點擊wait()
,直到notify()
出現爲止。然而,那麼問題是,當線程不在等待時發生了什麼?notify()
?如果我在未等待的線程上調用notify,會發生什麼情況?
P.S .:這個顯示器業務我在javadoc上一直在讀的是什麼?
我想擁有一個位於事件隊列頂部的線程並對其做出相應反應。我的想法是清除所有元素,一旦到達隊列尾部,請點擊wait()
,直到notify()
出現爲止。然而,那麼問題是,當線程不在等待時發生了什麼?notify()
?如果我在未等待的線程上調用notify,會發生什麼情況?
P.S .:這個顯示器業務我在javadoc上一直在讀的是什麼?
簡短的回答是,沒有任何反應。
稍微長一點的答案是,如果監視器上沒有任何東西在等待,沒有任何東西可以傳遞給通知,並且通知會自動丟棄。
您一直聽到的monitor只是您正在使用的原始鎖定機制的技術術語。 (IIRC這個術語是由監視器概念的發明者Tony Hoare創造的 - 他在併發方面做了很多開創性的工作。)
想法是,某些區域的代碼(在Java中,它們是同步方法正文和同步塊),一個線程只有在擁有排他鎖的情況下才能執行。想要進入這些區域的其他線程必須等待鎖定變爲可用。 wait
和notify
方法提供了與監視器結合使用的附加信令機制。
當另一個線程調用notify()方法時,某些線程不需要執行wait()方法。由於wait-and-notify機制不知道它正在發送通知的條件,因此它假定如果沒有線程在等待,通知就會被聽到。
換句話說,如果在沒有其他線程正在等待時調用notify()方法,則notify()將僅返回並且通知將丟失。稍後執行wait()方法的線程必須等待發生另一個通知。
在回答你的PS時,監視器是基本的併發基元之一。它們有幾種不同的風格,其中Java使用wait和notify變體。所有這一切都是維基百科的文章很好的解釋: