需要一个可以支持多个读者的队列

时间:2009-09-15 10:32:09

标签: java multithreading concurrency queue

我需要一个可由多个读者处理的队列。

读者将一个元素出列并将其发送到REST服务。

值得注意的是:

  • 每个读者都应该出列不同的元素。如果队列中有元素A,B和B组。 C,线程1应该出队A和线程2应该以并发方式出队B.等等,直到队列中没有任何内容。
  • 我知道总是在繁忙的循环中运行,窥视项目的队列是CPU密集型的。所以我不确定阻塞队列是否是一个不错的选择。

我有什么选择?

3 个答案:

答案 0 :(得分:8)

ConcurrentLinkedQueueLinkedBlockingQueue是两个可以立即想到的选项,具体取决于您是否需要阻止行为。

正如Adamski指出的那样,take()的{​​{1}}方法在等待数据到达时不会不必要地烧掉cpu周期。

答案 1 :(得分:7)

我不确定你的问题描述是否需要以严格的循环方式将元素出列。假设这不是限制,您可以使用BlockingQueue的{​​{1}}方法,这将导致线程阻塞,直到数据可用(因此不消耗CPU 周期)。

另请注意,take()实现是原子的(例如LinkedBlockingQueue):如果在take()上阻止了多个线程并且单个元素已排队,那么只有一个 thread的take()调用将返回;另一个将被阻止。

答案 2 :(得分:1)

ConcurrentLinkedQueue和LinkedBLockingQueue之间的主要区别在于其吞吐量。在中等线程争用下,ConcurrentLinkedQueue会大大超出所有其他BlockingQueues。然而,在严重的情况下,BlockingQueue是一个稍微好一点的选择,因为它会将竞争线程适当地放入等待的线程集中。