Java的BlockingQueue设计问题

4

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

boolean add(E e)

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

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

感谢您的知识!
Manuel

4个回答

5

这遵循了 Collection.add(E e) 的契约(因为 BlockingQueueCollection 的子类型):

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


基本上,只有“Set”类型在“add”操作时返回false。 - Powerlord

2
决策背后的原因是:快速失败。如果队列有限制容量,将抛出IllegalStateException异常。IllegalStateException是RuntimeException。因此,如果抛出异常,则可能是应用逻辑存在问题或应用逻辑不够严谨。换句话说,如果您想使用有限队列,则应用程序应该正确处理它(使用offer)。

1
我猜测它有一个布尔返回类型,因为它是Queue的子接口,而Queue也有一个boolean add(E obj)方法(这个方法又来自于Collection)。某些Queue实现通过返回false来拒绝向队列添加对象。 因此,你的问题的答案是,BlockingQueue的实现永远不会返回false。

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接