并发编程-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

posted @ 2018-12-19 17:15  qjm201000  阅读(216)  评论(0编辑  收藏  举报