BlockingQueue和putAll

时间:2010-07-02 01:28:22

标签: java blockingqueue

有人知道为什么java的BlockingQueue没有putAll方法吗?这种方法有问题吗?有没有完全重新实现BlockingQueue的任何好办法解决这个问题?

2 个答案:

答案 0 :(得分:2)

for (Item item : items) {
    queue.put(item);
}

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

我想它想要你逐一放1,以防线程等待从中读取,它们不等你完全读完它们。

答案 1 :(得分:0)

我在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>>,但这需要malloc列表。有时你想避免它。此外,假设您希望生产者和消费者使用相同的&#34; chunk&#34;尺寸。

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

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

您也可以考虑使用着名的(臭名昭着的?)LMAX Disruptor,但该模型与标准BlockingQueue完全不同,因为您无法控制何时使用这些项目。