有人知道为什么java的BlockingQueue没有putAll方法吗?这样的方法有问题吗?在不完全重新实现BlockingQueue的情况下,有什么好的方法可以解决这个问题吗?
发布于 2010-07-02 09:32:34
for (Item item : items) {
queue.put(item);
}3行,不确定这是完全重新实现阻塞队列。
我想它希望你把1放在1上,以防线程正在等待读取它,它们不是在等待你读完它们。
发布于 2017-12-15 10:38:52
我发现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>>,但这需要错误定位列表。有时你想要避免它。此外,这假设您希望生产者和消费者使用相同的“块”大小。
关于排出:同样,您可能希望生产者和消费者的块大小不匹配。因此,生产者可能会插入单个项目,但消费者可以批量工作。drainTo()不阻塞,所以drainAtLeastOneTo()是一种解决方案。
最后,我们复制了ArrayBlockingQueue的默认impl并直接添加了方法。同样,缺点是您需要操作一个具体的类型,而不是接口BlockingQueue。
你也可以考虑使用著名的(臭名昭著的?)LMAX Disruptor,但该模型与标准BlockingQueue有很大的不同,因为您无法控制何时使用项目。
https://stackoverflow.com/questions/3162743
复制相似问题