Java的BlockingQueue设计问题

发布于 2024-10-02 08:11:52 字数 344 浏览 8 评论 0原文

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

布尔加法(E e)

将指定元素插入到 如果可以的话,这个队列 立即不违反能力 限制,返回 true 成功并抛出一个 如果没有空格则抛出 IllegalStateException 目前可用。当使用 容量受限队列,它是 通常最好使用报价。

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

感谢您的知识!
曼努埃尔

the method java.util.concurrent.BlockingQueue.add(E e)'s JavaDoc reads:

boolean add(E e)

Inserts the specified element into
this queue if it is possible to do so
immediately without violating capacity
restrictions, returning true upon
success and throwing an
IllegalStateException if no space is
currently available. When using a
capacity-restricted queue, it is
generally preferable to use offer.

My question is: will it ever return false? if not, why does this method return a boolean?
It seems weird to me. What is the design decision behind this?

Thanks for your knowledge!
Manuel

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

仙女山的月亮 2024-10-09 08:11:52

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

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

It follows the contract of Collection.add(E e) (since BlockingQueue is a subtype of Collection):

If a collection refuses to add a
particular element for any reason
other than that it already contains
the element, it must throw an
exception (rather than returning
false). This preserves the invariant
that a collection always contains the
specified element after this call
returns.

作业与我同在 2024-10-09 08:11:52

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

The decision behind is: fail fast. The IllegalStateException will be thrown, if the queue has a limited capacity. IllegalStateException is a RuntimeException. So if the exception gets thrown, you probably have a fault in your application logic or your application logic is not defensive enough. Or to say it in other words: If you like to use a limited queue, your application should deal with it properly (use offer instead).

千と千尋 2024-10-09 08:11:52

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

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

I'm guessing it has a boolean return type because it's a subinterface of Queue, which also has a boolean add(E obj) method (which in turn is derived from Collection). Certain Queue implementations reject attempts to add objects to the queue by returning false.

Thus, the answer to your question is that implementations of BlockingQueue will never return false.

层林尽染 2024-10-09 08:11:52

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

The method returns a boolean because it overrides Collection#add(E e).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文