併發程式設計-concurrent指南-阻塞佇列-優先順序的阻塞佇列PriorityBlockingQueue
阿新 • • 發佈:2018-12-19
PriorityBlockingQueue是一個支援優先順序的無界阻塞佇列。
它使用了和類 java.util.PriorityQueue 一樣的排序規則。你無法向這個佇列中插入 null 值。
所有插入到 PriorityBlockingQueue 的元素必須實現 java.lang.Comparable 介面。因此該佇列中元素的排序就取決於你自己的 Comparable 實現。
PriorityBlockingQueue 對於具有相等優先順序(compare() == 0)的元素並不強制任何特定行為。
如果你從一個 PriorityBlockingQueue 獲得一個 Iterator 的話,該 Iterator 並不能保證它對元素的遍歷是以優先順序為序的。
由於PriorityBlockingQueue是無界佇列,因而使用put方法並不會阻塞,offer方法不會返回false。
PriorityBlockingQueue也是基於最小二叉堆實現
具體程式碼:
public class User implements Comparable<User>{ private String name; private int age; public User(String name,int age){ this.name = name; this.age = age; }public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public int compareTo(User o) {//年齡最小在佇列尾部,依次排序 return this.age -o.age; } }
import java.util.concurrent.PriorityBlockingQueue; public class Main { public static void main(String[] args) throws InterruptedException { //宣告佇列,這個是一個無界佇列,所以用的時候需要謹慎 PriorityBlockingQueue<User> priorityBlockingQueue = new PriorityBlockingQueue<User>(); priorityBlockingQueue.put(new User("張三",20)); priorityBlockingQueue.put(new User("李四",30)); priorityBlockingQueue.put(new User("王二",24)); priorityBlockingQueue.put(new User("劉一",27)); priorityBlockingQueue.put(new User("麻子",21)); // while(true){ User user = priorityBlockingQueue.take(); System.out.println(user.getName()+","+user.getAge()); } } }
結果:
張三,20
麻子,21
王二,24
劉一,27
李四,30
原始碼地址:https://github.com/qjm201000/concurrent_priorityBlockingQueue.git