我目前有一个并发队列实现,它使用BlockingQueue
作为数据存储。我现在需要引入具有更高优先级的第二种类型的对象,使我朝向原始队列的饥饿/优先级队列。所以我们正在处理由多个线程产生的类型A和类型B的对象。 B类型的任何对象都应在A类型的对象之前进行处理,但必须保持FIFO顺序以外的其他对象。所以如果插入{1A,1B,2A,3A,2B},顺序应该是{1B,2B,1A,2A,3A}协调多个并发队列
我试过一个单一的PriorityBlockingQueue
将B型推到前面,没有保持先入先出的要求(相同类型的项目之间没有自然顺序)。
我的下一个想法是使用两个并发队列。在协调两个队列之间的访问时,我正在寻找共同的问题或注意事项。理想情况下,我愿意做这样的事情:
public void add(A a)
{
aQueue.add(a);
}
public void add(B b)
{
bQueue.add(b);
}
private void consume()
{
if(!bQueue.isEmpty())
process(bQueue.poll());
else if(!aQueue.isEmpty())
process(aQueue.poll());
}
我是否需要任何同步或锁定,如果这两个队列ConcurrentLinkedQueue
(或在这里插入比较合适的结构)?注意我有很多制作者,但只有一个消费者(单线程ThreadPoolExecutor
)。
编辑:如果一个B在isEmpty()检查之后进来,那么可以处理一个A并在下一个consume()调用中处理它。
在A对象之前处理B对象有多重要?在你当前的代码中,如果在调用isEmpty()之后插入B对象,你会错过它。有两种不同的答案,这取决于你必须做什么...... – 2011-01-06 16:55:19
@Jonathan不重要。我的意思是补充说,不知怎么就把它排除在外了。问题已更新。 – 2011-01-06 17:01:30