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

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

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

重要的是要注意:

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

我有什么选择?

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

正如Adamski所说,LinkedBlockingQueue的take()方法在等待数据到达时不会不必要地烧掉cpu周期。

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

还要注意, take()实现是primefaces的(例如LinkedBlockingQueue ):如果在take()上阻塞了多个线程并且单个元素被排队, 则只返回一个线程的take()调用; 另一个将被阻止。

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