Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么';PriorityBlockingQueue的目的是什么?_Java_Multithreading_Parallel Processing_Priority Queue_Java.util.concurrent - Fatal编程技术网

Java 什么';PriorityBlockingQueue的目的是什么?

Java 什么';PriorityBlockingQueue的目的是什么?,java,multithreading,parallel-processing,priority-queue,java.util.concurrent,Java,Multithreading,Parallel Processing,Priority Queue,Java.util.concurrent,我一直在使用阻塞队列和PriorityQueue,这让我思考。我看不到PriorityBlockingQueue的好用例。优先级队列的要点是在检索之前对放入队列中的值进行排序。阻塞队列意味着将值插入其中并同时从中检索。但是,如果是这样的话,您永远无法保证排序顺序 BlockingQueue<Integer> q = new PriorityBlockingQueue<>(); new Thread (()->{ randomSleep(); q.put(2); r

我一直在使用阻塞队列和
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);
BlockingQueue q=new PriorityBlockingQueue();
新线程(()->{randomSleep();q.put(2);randomSleep();q.put(0);}).start();
新线程(()->{randomSleep();q.put(3);randomSleep();q.put(1);}).start();
ArrayList ordered=新的ArrayList(4);
对于(int i=0;i<4;i++){
随机睡眠();
添加(q.take());
}
系统输出打印项次(已订购);
在本例中,主线程获取提供值的顺序非常随机,这似乎不符合优先级队列的目的。即使只有一个生产商和一个消费者,订单也无法保证

那么,
PriorityBlockingQueue
有什么用呢

在本例中,主线程获取 值是非常随机的

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

尽管如此,您可以使用例如
PriorityBlockingQueue
按顺序输入一些元素(或任务),这些元素需要由多个线程通过其最高优先级的元素/任务并行拾取。在这种情况下,您可以利用结构的线程安全属性,确保最高优先级的元素总是排在第一位。

例如,任务队列中的任务具有优先级,并且您希望并行处理这些相同的任务

在本例中,主线程获取 值是非常随机的

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

尽管如此,您可以使用例如
PriorityBlockingQueue
按顺序输入一些元素(或任务),这些元素需要由多个线程通过其最高优先级的元素/任务并行拾取。在这种情况下,您可以利用结构的线程安全属性,确保最高优先级的元素总是排在第一位。

例如,任务队列中的任务具有优先级,并且您希望并行处理这些相同的任务