【问题标题】:Priority concurrent queue which removes lowest priority element when size reaches queue's capacity优先级并发队列,当大小达到队列容量时删除最低优先级元素
【发布时间】:2013-11-14 22:26:21
【问题描述】:

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

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

【问题讨论】:

  • 我对此表示怀疑,但从您的要求看来您可以自己实现它。
  • 感谢您的评论。我要求现成的解决方案。

标签: java concurrency priority-queue


【解决方案1】:

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

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

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

现在受过良好教育的多线程将立即发现我选择的非线程安全实现(仅计数,列表始终是线程安全的),但这可能没问题。可能发生的最糟糕的事情是队列被推到超过限制的最大线程数与要求的线程数减一相同。因此,如果有 4 个线程,队列可能会达到 limit + 3,而如果有 100 个线程,队列可能会达到 limit + 99。

现在,根据您使用的线程数以及保持在限制以下的重要性,您可以做 3 件事:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    相关资源
    最近更新 更多