2011-02-28 26 views
3

我想擁有一個位於事件隊列頂部的線程並對其做出相應反應。我的想法是清除所有元素,一旦到達隊列尾部,請點擊wait(),直到notify()出現爲止。然而,那麼問題是,當線程不在等待時發生了什麼?notify()如果我在未等待的線程上調用notify,會發生什麼情況?

P.S .:這個顯示器業務我在javadoc上一直在讀的是什麼?

回答

6

簡短的回答是,沒有任何反應。

稍微長一點的答案是,如果監視器上沒有任何東西在等待,沒有任何東西可以傳遞給通知,並且通知會自動丟棄。

您一直聽到的monitor只是您正在使用的原始鎖定機制的技術術語。 (IIRC這個術語是由監視器概念的發明者Tony Hoare創造的 - 他在併發方面做了很多開創性的工作。)

想法是,某些區域的代碼(在Java中,它們是同步方法正文和同步塊),一個線程只有在擁有排他鎖的情況下才能執行。想要進入這些區域的其他線程必須等待鎖定變爲可用。 waitnotify方法提供了與監視器結合使用的附加信令機制。

4

當另一個線程調用notify()方法時,某些線程不需要執行wait()方法。由於wait-and-notify機制不知道它正在發送通知的條件,因此它假定如果沒有線程在等待,通知就會被聽到。

換句話說,如果在沒有其他線程正在等待時調用notify()方法,則notify()將僅返回並且通知將丟失。稍後執行wait()方法的線程必須等待發生另一個通知。

相關問題