需要一个可以支持多个读者的队列
我需要一个可以由多个读者处理的队列。
读者将一个元素出列并将其发送到REST服务。
重要的是要注意:
- 每个读者都应该出列不同的元素。 如果队列具有元素A,B和C,则线程1应该出列A并且线程2应该以并发方式出列B. 等等,直到队列中没有任何内容。
- 我知道总是在繁忙的循环中运行,窥视项目的队列是CPU密集型的。 所以我不确定阻塞队列是不是一个好选择。
我有什么选择?
ConcurrentLinkedQueue或LinkedBlockingQueue是立即想到的两个选项,具体取决于您是否需要阻止行为。
正如Adamski所说,LinkedBlockingQueue的take()
方法在等待数据到达时不会不必要地烧掉cpu周期。
我不确定你的问题描述是否需要以严格的循环方式将元素出列。 假设这不是限制,您可以使用BlockingQueue
的take()
方法,这将导致线程阻塞,直到数据可用(因此不消耗CPU周期)。
还要注意, take()
实现是primefaces的(例如LinkedBlockingQueue
):如果在take()
上阻塞了多个线程并且单个元素被排队, 则只返回一个线程的take()调用; 另一个将被阻止。
ConcurrentLinkedQueue和LinkedBLockingQueue之间的主要区别在于其吞吐量。 在中等线程争用下,ConcurrentLinkedQueue会大大超出所有其他BlockingQueues。 然而,在严重的情况下,BlockingQueue是一个稍微好一点的选择,因为它会将竞争线程适当地放入等待的线程集中。