PriorityBlockingQueue 的用途是什么?
What's the purpose of the PriorityBlockingQueue?
我一直在 阻塞队列和 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
有什么用呢?
In this example, the order in which the main thread gets the offered
values is quite random
嗯,在插入和检索这些元素的过程中存在竞争条件。因此,它看起来随机的原因。
尽管如此,您可以使用 PriorityBlockingQueue
来按顺序排列一些元素(或任务),这些元素(或任务)需要由多个线程以 它们的最高优先级并行拾取 element/task。在这种情况下,您可以利用结构的线程安全属性来保证 最高优先级元素始终排在第一位。
一个例子是任务队列,其中这些任务具有优先级,并且您希望并行处理这些相同的任务。
我一直在 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
有什么用呢?
In this example, the order in which the main thread gets the offered values is quite random
嗯,在插入和检索这些元素的过程中存在竞争条件。因此,它看起来随机的原因。
尽管如此,您可以使用 PriorityBlockingQueue
来按顺序排列一些元素(或任务),这些元素(或任务)需要由多个线程以 它们的最高优先级并行拾取 element/task。在这种情况下,您可以利用结构的线程安全属性来保证 最高优先级元素始终排在第一位。
一个例子是任务队列,其中这些任务具有优先级,并且您希望并行处理这些相同的任务。