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