【问题标题】:What's the purpose of the PriorityBlockingQueue?PriorityBlockingQueue 的目的是什么?
【发布时间】:2021-06-10 19:27:39
【问题描述】:

我一直在 playing 处理阻塞队列和 PriorityQueue,这让我开始思考。我看不到 PriorityBlockingQueue 的好用例。优先级队列的重点是在检索之前对放入其中的值进行排序。阻塞队列意味着将值插入其中并同时从中检索。但是,如果是这种情况,您将永远无法保证排序顺序。

BlockingQueue<Integer> q = new PriorityBlockingQueue<>();

new Thread (()->{ randomSleep(); q.put(2); randomSleep(); q.put(0); }).start();
new Thread (()->{ randomSleep(); q.put(3); randomSleep(); q.put(1); }).start();

ArrayList<Integer> ordered = new ArrayList<>(4);
for (int i = 0; i < 4; i++) {
    randomSleep();
    ordered.add(q.take());
}
System.out.println(ordered);

在这个例子中,主线程获取提供的值的顺序是非常随机的,这似乎违背了优先级队列的目的。即使只有一个生产者和一个消费者,也无法保证顺序。

那么,PriorityBlockingQueue 有什么用呢?

【问题讨论】:

    标签: java multithreading parallel-processing priority-queue java.util.concurrent


    【解决方案1】:

    在这个例子中,主线程获取offer的顺序 值是相当随机的

    在插入和检索这些元素的过程中,您有一个竞争条件。因此,它看起来随机的原因。

    不过,您可以使用例如PriorityBlockingQueue 来按顺序排列一些元素(或任务),这些元素(或任务)需要由多个线程并行处理,由它们的最高优先级元素/任务 .在这种情况下,您可以利用结构的线程安全属性来保证最高优先级的元素始终排在第一位。

    一个示例是任务队列,其中这些任务具有优先级,并且您希望并行处理这些相同的任务。

    【讨论】:

      猜你喜欢
      • 2021-06-07
      • 1970-01-01
      • 1970-01-01
      • 2011-03-05
      • 2015-03-21
      • 1970-01-01
      • 1970-01-01
      • 2019-07-14
      • 2018-11-04
      相关资源
      最近更新 更多