我用Java的LinkedBlockingDeque实现了生产者-消费者模式,但我遇到了一个问题,我有时想把一个项目(已经在队列中的某个地方)移到队列的前面,这样它就能更快地被处理。我从来不知道哪些已经排好队的项目可以移到最前面。因此,我希望将LinkedBlockingDeque替换为可以对项目进行重新排序的内容。我有一个生产者和2-4个消费者(自定义线程实现),我在Android平台上。我该怎么做呢?一些阻塞的双连接链表?
发布于 2013-01-07 18:48:19
来自我的评论:
您可以使用remove(Object o)
检索对象并将其从队列中删除,然后使用addFirst(Object o)
将其添加到队列的前面。这将具有确定此对象的优先级的效果。
您可以使用迭代器来检查Deque中有哪些对象。但是要非常小心ConcurrentModificationException
,因为如果你在一个线程中访问集合并在另一个线程中修改它,它们可能会被引发,但是如果你使用的是blockingQueue,这应该不是问题。
从BlockingQueue Javadoc:
BlockingQueue实现是线程安全的。所有队列方法都使用内部锁或其他形式的并发控制自动实现它们的效果。但是,除非在实现中另有指定,否则不一定以原子方式执行批量收集操作addAll、containsAll、retainAll和removeAll。因此,例如,在仅添加了c.
中的一些元素之后,addAll(c)就有可能失败(抛出异常)
发布于 2012-12-19 08:28:04
看看PriorityBlockingQueue吧。它可能会满足你的需要。您可以插入具有名义优先级的项,然后当您想要调整元素的一些优先级时,您可以将其从队列中删除,并使用新的优先级重新添加它。
https://stackoverflow.com/questions/13943662
复制相似问题