1

我使用 Java 的 LinkedBlockingDeque 实现了生产者-消费者模式,但是我遇到了一个问题,我有时想将一个项目(已经在队列中的某个位置)移动到队列的前面,所以它被更快地处理。我永远不知道哪些已经排队的项目适合移到前面。因此,我希望将 LinkedBlockingDeque 替换为可以重新排序项目的东西。我有一个生产者和 2-4 个消费者(自定义线程实现),我在 Android 平台上。我怎样才能做到这一点?一些阻塞的双连接链表?

4

2 回答 2

0

从我的评论:

您可以使用remove(Object o)检索对象并将其从队列中删除,然后使用addFirst(Object o)将其添加到队列的前面。这将具有优先考虑该对象的效果。

您使用迭代器来检查 Deque 中的对象。但是要非常小心,ConcurrentModificationException因为如果您在一个线程中访问集合并在另一个线程中对其进行修改,则可能会引发它们,但是如果您使用的是阻塞队列,这应该不是问题。

来自BlockingQueue Javadoc:

BlockingQueue 实现是线程安全的。所有排队方法都使用内部锁或其他形式的并发控制以原子方式实现其效果。然而,批量收集操作 addAll、containAll、retainAll 和 removeAll 不一定以原子方式执行,除非在实现中另外指定。因此,例如,addAll(c) 在仅添加 c 中的一些元素后可能会失败(抛出异常)。

于 2013-01-07T10:48:18.987 回答
-1

看看PriorityBlockingQueue。它可能会满足您的需求。您可以插入具有名义优先级的项目,然后当您想要调整某些元素的优先级时,将其从队列中删除并重新添加新的优先级。

于 2012-12-19T00:28:03.527 回答