版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dongyuxu342719/article/details/88915416
PriorityBlockingQueue顾名思义是带有优先级的阻塞队列,为了实现按优先级弹出数据,存入其中的对象必须实现comparable接口自定义排序方法。取出数据时会按照compareTo方法排序后的顺序取出。
首先是定义实现comparable接口的类:
/**
* 添加到优先级队列的对象需要自定义排序方法
* @author SN
*
*/
public class Product implements Comparable<Product>{
private int id;
private String name;
@Override
public int compareTo(Product product){
return this.id<product.id?-1:(this.id>product.id?1:0);
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String toString(){
return this.id+","+this.name;
}
}
然后是测试操作优先级阻塞队列:
import java.util.concurrent.PriorityBlockingQueue;
public class PriorityQueueExp {
//优先级阻塞队列添加的对象必须实现comparable接口才能进行排序
static PriorityBlockingQueue<Product> pbq=new PriorityBlockingQueue<>();
public static void main(String[] args) throws InterruptedException {
Product p1=new Product();
p1.setId(1);
p1.setName("数据1");
Product p2=new Product();
p2.setId(3);
p2.setName("数据3");
Product p3=new Product();
p3.setId(2);
p3.setName("数据2");
Product p4=new Product();
p4.setId(4);
p4.setName("数据4");
pbq.add(p1);
pbq.add(p2);
pbq.add(p3);
pbq.add(p4);
System.out.println("队列中的数据:"+pbq);
System.out.println("取出队列中的第一个数据"+pbq.take().toString());
System.out.println("队列中的数据:"+pbq);
Product p5=new Product();
p5.setId(1);
p5.setName("数据1");
pbq.add(p5);
Product p6=new Product();
p6.setId(6);
p6.setName("数据6");
pbq.add(p6);
System.out.println("队列中的数据:"+pbq);
}
}
值得注意的是,从打印结果看,数据插入队列是按先进先出的顺序插入的,并没有在插入队列时就提前排好序。在第一次取出数据后再次查看队列中的数据会发现,队列中的数据已经排好序,后面在进行任何插入、取出操作都会进行排序,因此可以得出优先级阻塞队列是延迟排序的,只有在第一次取出数据后才会进行排序。这样应该也是作者在设计优先级队列时进行的一个性能上的优化。类似于类的延迟加载。