6

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

4

2 回答 2

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

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

我想它希望您将 1 逐个放入以防线程正在等待从中读取,而不是在等待您完成全部阅读。

于 2010-07-02T01:32:34.120 回答
1

我发现了同样的问题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'ing 列表。有时你想避免它。此外,假设您希望生产者和消费者使用相同的“块”大小。

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

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

您也可以考虑使用著名的(臭名昭著的?) LMAX Disruptor,但该模型与标准模型完全不同BlockingQueue,因为您无法控制何时消耗物品。

于 2017-12-15T02:38:52.087 回答