2010-06-06 55 views
1

我有一個消費者線程,採用LinkedBlockingQueue中的元素,並在空閒時手動進行休眠。我使用peek()來查看隊列是否爲空,因爲在發送線程進入睡眠之前我必須做些什麼,並且我使用queue.wait()來做到這一點。LinkedBlockingQueue上的add()是否通知等待線程?


所以,當我在另一個線程和add()隊列的元素是,是否自動通知,這是wait()荷蘭國際集團在隊列中的線程?

回答

2

是的。或者說,它確實使用了更高效的內部鎖定對象,而不是外部隊列對象的鎖定;如果你想睡覺,直到某些東西到達隊列中,請阻止take()。 (如果在等待時還有其他事情要做,請考慮阻塞隊列是否是從其他地方接收消息的正確方式。)

+0

它實際上在內部具有兩個鎖,一個處理隊列空情況的通知,另一個處理隊列滿的情況。他們是'私人的' - 有很好的理由 - 所以使用API​​是爲了使用它。 – 2010-06-07 00:08:55