Java的PriorityBlockingQueue优先级阻塞队列代码实例

 更新时间:2023年12月13日 10:35:07   作者: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阻塞队列内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java毕业设计实战之食品溯源系统的实现

    Java毕业设计实战之食品溯源系统的实现

    这是一个使用了java+Springboot+Maven+mybatis+Vue+mysql+wd开发的食品溯源系统,是一个毕业设计的实战练习,具有食品溯源该有的所有功能,感兴趣的朋友快来看看吧
    2022-01-01
  • SpringBoot整合BCrypt实现密码加密

    SpringBoot整合BCrypt实现密码加密

    这篇文章主要为大家详细介绍了SpringBoot整合BCrypt进行密码加密,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • Mybatis useGeneratedKeys参数用法及问题小结

    Mybatis useGeneratedKeys参数用法及问题小结

    这篇文章主要介绍了Mybatis useGeneratedKeys参数用法及遇到的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • Java解决计算一个字符串长度问题的实战指南

    Java解决计算一个字符串长度问题的实战指南

    在Java编程中,处理字符串是非常常见的任务之一,这篇文章主要介绍了如何Java解决计算一个字符串长度的问题,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下
    2026-03-03
  • Java进阶之FileUpload完成上传的实例

    Java进阶之FileUpload完成上传的实例

    这篇文章主要介绍了 Java进阶之FileUpload完成上传的实例的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-09-09
  • Spring6整合JUnit的详细步骤

    Spring6整合JUnit的详细步骤

    这篇文章主要介绍了Spring6整合JUnit的详细步骤,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05
  • Spring定时任务中@PostConstruct被多次执行异常的分析与解决

    Spring定时任务中@PostConstruct被多次执行异常的分析与解决

    这篇文章主要给大家介绍了关于Spring定时任务中@PostConstruct被多次执行异常的分析与解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-10-10
  • 详解Java深拷贝,浅拷贝和Cloneable接口

    详解Java深拷贝,浅拷贝和Cloneable接口

    这篇文章主要为大家详细介绍了Java中Cloneable接口以及深拷贝与浅拷贝的相关知识,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-08-08
  • java面试题——详解HashMap和Hashtable 的区别

    java面试题——详解HashMap和Hashtable 的区别

    本篇文章主要介绍了java中HashMap和Hashtable的区别,具有一定的参考价值,有需要的可以了解一下。
    2016-11-11
  • IDEA 2020 本土化,真的是全中文了(真香)

    IDEA 2020 本土化,真的是全中文了(真香)

    去年,JetBrains 网站进行了本地化,提供了 8 种不同的语言版本,而现在,团队正在对基于 IntelliJ 的 IDE 进行本地化
    2020-12-12

最新评论