4

方法 java.util.concurrent.BlockingQueue.add(E e) 的 JavaDoc 内容如下:

布尔加法(E e)

如果可以在不违反容量限制的情况下立即将指定元素插入此队列,则在成功时返回 true,如果当前没有可用空间则抛出 IllegalStateException。当使用容量受限的队列时,通常最好使用 offer。

我的问题是:它会返回假吗?如果不是,为什么这个方法返回一个布尔值?我觉得很奇怪。这背后的设计决策是什么?

谢谢你的知识!
曼努埃尔

4

4 回答 4

5

它遵循Collection.add(E e)(因为BlockingQueue是 的子类型Collection)的契约:

如果一个集合拒绝添加一个特定元素,除了它已经包含该元素之外,它必须抛出一个异常(而不是返回 false)。这保留了在此调用返回后集合始终包含指定元素的不变量。

于 2010-11-12T20:19:14.783 回答
2

背后的决定是:快速失败。如果队列容量有限,将抛出 IllegalStateException。IllegalStateException 是一个 RuntimeException。因此,如果抛出异常,您的应用程序逻辑可能存在错误,或者您的应用程序逻辑没有足够的防御性。或者换句话说:如果您喜欢使用有限队列,您的应用程序应该正确处理它(offer改为使用)。

于 2010-11-12T20:20:17.703 回答
1

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

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

于 2010-11-12T20:19:28.333 回答
1

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

于 2010-11-12T20:19:38.673 回答