Java BlockingQueue设计问题

时间:2010-11-12 20:10:43

标签: java blockingqueue

方法java.util.concurrent.BlockingQueue.add(E e)的JavaDoc读取:

  

布尔加法(E e)

     

将指定的元素插入   这个队列是否可以这样做   立刻没有违反能力   限制,回归真实   成功并投掷   如果没有空格,则为IllegalStateException   目前可用。使用时   容量限制队列,它是   通常优先使用报价。

我的问题是:它会丢失吗?如果没有,为什么这个方法返回一个布尔值? 这对我来说似乎很奇怪。这背后的设计决定是什么?

感谢您的了解!
曼努埃尔

4 个答案:

答案 0 :(得分:5)

遵循Collection.add(E e)的合同(因为BlockingQueueCollection的子类型):

  

如果集合拒绝添加   出于任何原因的特殊要素   除了它已经包含的   元素,它必须抛出一个   例外(而不是返回   假)。这保留了不变量   一个集合总是包含   此调用后指定的元素   回报。

答案 1 :(得分:2)

背后的决定是:快速失败。如果队列的容量有限,则抛出IllegalStateException。 IllegalStateException是一个RuntimeException。因此,如果抛出异常,您可能在应用程序逻辑中出现故障,或者您的应用程序逻辑不够具有防御性。换句话说:如果您想使用有限的队列,您的应用程序应该正确处理它(改为使用offer)。

答案 2 :(得分:1)

我猜它有一个布尔返回类型,因为它是Queue的子接口,它也有一个boolean add(E obj)方法(后者又来自Collection)。某些Queue实现拒绝通过返回false将对象添加到队列的尝试。

因此,您的问题的答案是BlockingQueue的实现永远不会返回false。

答案 3 :(得分:1)

该方法返回一个布尔值,因为它会覆盖Collection#add(E e)