我一直在玩阻塞队列和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呢?