首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BlockingQueue和putAll

BlockingQueue和putAll
EN

Stack Overflow用户
提问于 2010-07-02 09:28:22
回答 2查看 708关注 0票数 6

有人知道为什么java的BlockingQueue没有putAll方法吗?这样的方法有问题吗?在不完全重新实现BlockingQueue的情况下,有什么好的方法可以解决这个问题吗?

EN

回答 2

Stack Overflow用户

发布于 2010-07-02 09:32:34

代码语言:javascript
复制
for (Item item : items) {
    queue.put(item);
}

3行,不确定这是完全重新实现阻塞队列。

我想它希望你把1放在1上,以防线程正在等待读取它,它们不是在等待你读完它们。

票数 1
EN

Stack Overflow用户

发布于 2017-12-15 10:38:52

我发现ArrayBlockingQueue也有同样的问题。我们想要一些缺少的额外方法:

  • void putAll(Collection<? extends E> c) throws InterruptedException
  • int drainAtLeastOneTo(@OutputParam Collection<? super E> c) throws InterruptedException
  • int drainAtLeastOneTo(@OutputParam Collection<? super E> c, int maxElements) throws InterruptedException

有些人主张使用BlockingQueue<List<E>>,但这需要错误定位列表。有时你想要避免它。此外,这假设您希望生产者和消费者使用相同的“块”大小。

关于排出:同样,您可能希望生产者和消费者的块大小不匹配。因此,生产者可能会插入单个项目,但消费者可以批量工作。drainTo()不阻塞,所以drainAtLeastOneTo()是一种解决方案。

最后,我们复制了ArrayBlockingQueue的默认impl并直接添加了方法。同样,缺点是您需要操作一个具体的类型,而不是接口BlockingQueue

你也可以考虑使用著名的(臭名昭著的?)LMAX Disruptor,但该模型与标准BlockingQueue有很大的不同,因为您无法控制何时使用项目。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3162743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档