我需要一个可由多个读者处理的队列。
读者将一个元素出列并将其发送到REST服务。
值得注意的是:
我有什么选择?
答案 0 :(得分:8)
ConcurrentLinkedQueue或LinkedBlockingQueue是两个可以立即想到的选项,具体取决于您是否需要阻止行为。
正如Adamski指出的那样,take()
的{{1}}方法在等待数据到达时不会不必要地烧掉cpu周期。
答案 1 :(得分:7)
我不确定你的问题描述是否需要以严格的循环方式将元素出列。假设这不是限制,您可以使用BlockingQueue
的{{1}}方法,这将导致线程阻塞,直到数据可用(因此不消耗CPU 周期)。
另请注意,take()
实现是原子的(例如LinkedBlockingQueue
):如果在take()
上阻止了多个线程并且单个元素已排队,那么只有一个 thread的take()调用将返回;另一个将被阻止。
答案 2 :(得分:1)
ConcurrentLinkedQueue和LinkedBLockingQueue之间的主要区别在于其吞吐量。在中等线程争用下,ConcurrentLinkedQueue会大大超出所有其他BlockingQueues。然而,在严重的情况下,BlockingQueue是一个稍微好一点的选择,因为它会将竞争线程适当地放入等待的线程集中。