2010-11-12 71 views
4

方法java.util.concurrent.BlockingQueue.add(E E)的JavaDoc的寫着:Java的BlockingQueue的設計問題

布爾加(E E)

插入指定的元素插入 這隊列如果可以這樣做 立即沒有違反容量 限制,返回true時 成功並拋出 IllegalStateException如果沒有空間是 當前可用。當使用 容量受限的隊列時,通常更願意使用優惠價格爲 。

我的問題是:它會永遠返回假嗎?如果沒有,爲什麼這個方法返回一個布爾值? 對我來說這似乎很奇怪。這背後的設計決定是什麼?

謝謝你的知識!
曼努埃爾

回答

5

它遵循的Collection.add(E e)合同(因爲BlockingQueueCollection亞型):

如果一個集合拒絕添加 特定元素以外,它已經包含 其他任何理由 元素,它必須拋出異常(而不是返回 false)。這將保留不變的 ,在調用 返回後,集合始終包含指定元素 。

+0

本質上,只有'Set'類型爲'add'返回false。 – Powerlord 2010-11-12 21:06:38

1

我猜它有一個布爾返回類型,因爲它是Queue子接口,其中也有一個boolean add(E obj)方法(這又是從Collection派生)。某些Queue實現通過返回false來拒絕嘗試將對象添加到隊列中。

因此,您的問題的答案是BlockingQueue的實現永遠不會返回false。

2

後面的決定是:失敗很快。如果隊列的容量有限,則會拋出IllegalStateException。 IllegalStateException是RuntimeException。所以如果拋出異常,你的應用程序邏輯可能有錯誤,或者你的應用程序邏輯不夠防禦。或換句話說:如果你想使用有限隊列,你的應用程序應該正確處理它(改用offer)。