有人知道为什么java的BlockingQueue没有putAll方法吗?这种方法有问题吗?有没有完全重新实现BlockingQueue的任何好办法解决这个问题?
答案 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
完全不同,因为您无法控制何时使用这些项目。