Java的PriorityBlockingQueue优先级阻塞队列代码实例
作者:Terisadeng
这篇文章主要介绍了Java的PriorityBlockingQueue优先级阻塞队列代码实例,PriorityBlockingQueue顾名思义是带有优先级的阻塞队列,为了实现按优先级弹出数据,存入其中的对象必须实现comparable接口自定义排序方法,需要的朋友可以参考下
PriorityBlockingQueue阻塞队列
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); } }
值得注意的是,从打印结果看,数据插入队列是按先进先出的顺序插入的,并没有在插入队列时就提前排好序。在第一次取出数据后再次查看队列中的数据会发现,队列中的数据已经排好序,后面在进行任何插入、取出操作都会进行排序,因此可以得出优先级阻塞队列是延迟排序的,只有在第一次取出数据后才会进行排序。这样应该也是作者在设计优先级队列时进行的一个性能上的优化。类似于类的延迟加载。
到此这篇关于Java的PriorityBlockingQueue优先级阻塞队列代码实例的文章就介绍到这了,更多相关PriorityBlockingQueue阻塞队列内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!