1. 程式人生 > >併發程式設計-concurrent指南-阻塞佇列-優先順序的阻塞佇列PriorityBlockingQueue

併發程式設計-concurrent指南-阻塞佇列-優先順序的阻塞佇列PriorityBlockingQueue

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