簡體   English   中英

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有什么用呢?

在這個例子中,主線程獲取提供的值的順序是非常隨機的

好吧,在插入和檢索這些元素期間,您有一個競爭條件。 因此,它看起來隨機的原因。

盡管如此,您可以使用例如PriorityBlockingQueue順序排列一些元素(或任務),這些元素(或任務)需要由多個線程並行拾取,由它們的最高優先級元素/任務並行處理。 在這種情況下,您可以利用結構的線程安全屬性來保證最高優先級的元素始終排在第一位。

一個示例是任務隊列,其中這些任務具有優先級,並且您希望並行處理這些相同的任務。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM