优先级并发队列,当大小达到队列容量时,删除最低优先级元素

时间:2013-11-13 08:45:40

标签: java concurrency priority-queue

我使用PriorityBlockingQueue。它是线程安全的并且允许优先级。但我需要以下功能:

当新元素添加到队列并且队列大小相等时,则删除第一个(最低优先级)元素。 是否有一些符合我要求的队列?

1 个答案:

答案 0 :(得分:1)

没有Collection同时提供排序,并发和有界容量,因此您必须选择其中两个功能并为第三个添加手写解决方案。

然而,使用PriorityBlockingQueue检查大小是微不足道的,同样是线程安全的:

while (myQueue.size() >= THRESHOLD) {
  Element e = myQueue.poll();
  if (e != null) {
    process(e);
  }
}
myQueue.add(newElement);

现在受过良好教育的多线程会立即发现我选择的非线程安全实现(只有计数,列表始终是线程安全的),但这可能没问题。可能发生的最糟糕的事情是,队列被超过限制,最多可以减少一个线程。因此,对于4个线程,队列可以处于极限+3,而对于100个线程,它可以处于极限+ 99。

现在,根据您使用的线程数以及保持低于限制的重要程度,您可以执行以下操作:

  1. 接受有时违反限制。
  2. 如果您只有几个线程,请将限制设置为实际限制减去线程数。
  3. 添加同步变体以确保只有一个线程正在运行上述指令。