【发布时间】:2010-07-02 01:28:22
【问题描述】:
有人知道为什么 java 的 BlockingQueue 没有 putAll 方法吗?这种方法有问题吗?有什么好的方法可以解决这个问题而无需完全重新实现 BlockingQueue?
【问题讨论】:
标签: java blockingqueue
有人知道为什么 java 的 BlockingQueue 没有 putAll 方法吗?这种方法有问题吗?有什么好的方法可以解决这个问题而无需完全重新实现 BlockingQueue?
【问题讨论】:
标签: java blockingqueue
for (Item item : items) {
queue.put(item);
}
3 行,不确定那是完全重新实现阻塞队列。
我想它希望你把 1 一个 1 放在一个线程正在等待读取它的情况下,它们不会等待你完成所有的读取。
【讨论】:
我在ArrayBlockingQueue 上发现了同样的问题。我们想要一些缺少的额外方法:
void putAll(Collection<? extends E> c)
throws InterruptedExceptionint drainAtLeastOneTo(@OutputParam Collection<? super E> c)
throws InterruptedExceptionint drainAtLeastOneTo(@OutputParam Collection<? super E> c, int maxElements)
throws InterruptedException有些人提倡使用BlockingQueue<List<E>>,但这需要malloc'ing 列表。有时你想避免它。此外,这假设您希望生产者和消费者使用相同的“块”大小。
关于耗尽:同样,您可能希望生产者和消费者的块大小不匹配。所以生产者可能会插入单个项目,但消费者会批量工作。 drainTo() 不会阻塞,所以 drainAtLeastOneTo() 是一个解决方案。
最后,我们复制了ArrayBlockingQueue的默认impl,直接添加了方法。同样,一个缺点是您需要对具体类型进行操作,而不是接口BlockingQueue。
您也可以考虑使用著名的(臭名昭著的?)LMAX Disruptor,但该模型与标准的 BlockingQueue 完全不同,因为您无法控制何时消耗物品。
【讨论】: