需要一个能够支持多个读取者的队列。

3
我需要一个可以由多个读者处理的队列。
读者将出列一个元素并将其发送到REST服务。
需要注意的重点是:
- 每个读者应该出列不同的元素。如果队列有元素A、B和C,线程1应该出列A,线程2应该以并发方式出列B。直到队列中没有任何东西。 - 我知道总是在繁忙的循环中运行,窥视队列是否有项目会消耗CPU资源。因此,我不确定阻塞队列是否是一个好的选择。
我应该选择哪个选项?
3个回答

9

ConcurrentLinkedQueueLinkedBlockingQueue是两个可以考虑的选项,具体取决于您是否需要阻塞行为。

正如Adamski所指出的那样,LinkedBlockingQueuetake()方法在等待数据到达时不会浪费CPU周期。


其实我有点不清楚哪种队列实现更合适:LinkedBlockingQueue 还是 ConcurrentLinkedQueue - 我总是出于习惯使用 LinkedBlockingQueue。这里有人有什么建议吗? - Adamski
ConcurrentLinkedQueue没有任何阻塞,因此很可能不适合您的使用情况。标准的生产者/消费者集合是BlockingQueue。LinkedBlockingQueue是一个很好的默认选择。 - james
1
同詹姆斯意见一致 - 使用 take() 的 LinkedBlockingQueue 可能是此情况下的适当解决方案。 - Amber

7
我不确定你的问题描述中是否需要线程以严格的轮询方式出队元素。假设这不是限制,您可以使用BlockingQueuetake()方法,它将导致线程阻塞,直到数据可用(因此不会消耗CPU周期)。
还要注意,take()实现是原子的(例如LinkedBlockingQueue):如果多个线程都在take()上被阻塞,并且一个单一元素被入队,则只有一个线程的take()调用会返回;其他线程将保持阻塞状态。

不需要轮询方式。我甚至可能会将读取线程数增加到3或4个。听起来LinkedBlockingQueue很适合我。谢谢。 - Jacques René Mesrine

1
ConcurrentLinkedQueue 和 LinkedBlockingQueue 的主要区别在于吞吐量。在适度线程争用的情况下,ConcurrentLinkedQueue 远远优于所有其他 BlockingQueues。然而,在严重争用的情况下,BlockingQueue 是一个稍微更好的选择,因为它会适当地将争用线程放入等待线程集合中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接