java并发编程工具类PriorityBlockingQueue优先级队列

 更新时间:2022年03月16日 10:13:26   作者:字母哥哥  
这篇文章主要为大家介绍了java并发编程工具类PriorityBlockingQueue优先级队列的方法示例应用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步

前言

在之前的文章中已经为大家介绍了java并发编程的工具:BlockingQueue接口、ArrayBlockingQueue、DelayQueue、LinkedBlockingQueue,本文为系列文章第五篇。

Java PriorityBlockingQueue队列是BlockingQueue接口的实现类,它根据priority优先级确定队列内元素对象的处理顺序,也就是说在一个PriorityBlockingQueue队列中,被添加到队列中的元素,根据priority进行排序。PriorityBlockingQueue具有BlockingQueue阻塞队列的一些特性,如果您不熟悉BlockingQueue可以参看我之前的文章。

1. PriorityBlockingQueue 特性

  • PriorityBlockingQueue 是一个无界队列(队列内元素个数没有上限),队列容量可以自动增长。其初始化队列容量为11,也可以通过构造函数参数initialCapacity指定其初始化容量。
  • 不接受 NULL对象插入到PriorityBlockingQueue
  • 添加到PriorityBlockingQueue队列中的元素对应的Java类,通常需要实现Comparable接口或者是可以默认排序的对象(如数字、字符串),否则会抛出ClassCastException
  • 可以使用java8 的Comparator提供自定义队列内元素的排序规则,后文会举例说明。
  • 如果存在多个对象拥有相等的优先级,从队列中poll获取元素的时候可能获取到其中任何一个元素。
  • PriorityBlockingQueue 是线程安全的

2. PriorityBlockingQueue 应用实例

我们写一个类Employee,该类实现了Comparable接口,所以其实例对象可以根据compareTo()函数定义的规则进行排序。

public class Employee implements Comparable<Employee> {
    private Long id;
    private String name;
    private LocalDate dob;
    //Getters and setters
    public Employee(Long id, String name, LocalDate dob) {
        super();
        this.id = id;
        this.name = name;
        this.dob = dob;
    }
    @Override
    public int compareTo(Employee emp) {
        return this.getId().compareTo(emp.getId());  //根据id排序
    }
    @Override
    public String toString() {
        return "Employee [id=" + id + ", name=" + name + ", dob=" + dob + "]";
    }
}

构造一个PriorityBlockingQueue对象,并向其内部加入若干Employee对象,并使用poll方法从队列内取出元素。

PriorityBlockingQueue<Employee> priorityBlockingQueue = new PriorityBlockingQueue<>();
priorityBlockingQueue.add(new Employee(1l, "AAA", LocalDate.now()));
priorityBlockingQueue.add(new Employee(4l, "CCC", LocalDate.now()));
priorityBlockingQueue.add(new Employee(5l, "BBB", LocalDate.now()));
priorityBlockingQueue.add(new Employee(2l, "FFF", LocalDate.now()));
priorityBlockingQueue.add(new Employee(3l, "DDD", LocalDate.now()));
priorityBlockingQueue.add(new Employee(6l, "EEE", LocalDate.now()));
while(true) {
  Employee e = priorityBlockingQueue.poll();
  System.out.println(e);

  if(e == null) break;
}

根据上文中compareTo()方法定义的排序规则,按照id为优先级,所以从队列中拿出对象并打印的顺序如下:

Employee [id=1, name=AAA, dob=2021-03-25]
Employee [id=2, name=FFF, dob=2021-03-25]
Employee [id=3, name=DDD, dob=2021-03-25]
Employee [id=4, name=CCC, dob=2021-03-25]
Employee [id=5, name=BBB, dob=2021-03-25]
Employee [id=6, name=EEE, dob=2021-03-25]

3. 使用 Java8 Comparator 做优先级排序的实例

我们可以使用java 8 Comparator排序器,来定义优先级排序规则。使用构造方法PriorityBlockingQueue(int initialCapacity, Comparator comparator) 构造PriorityBlockingQueue队列。

//以员工名称的字符串自然正序进行排序
Comparator<Employee> nameSorter = Comparator.comparing(Employee::getName);
PriorityBlockingQueue<Employee> priorityBlockingQueue = new PriorityBlockingQueue<>( 11, nameSorter );
//此处省略向队列中添加对象,及循环取出对象打印的代码,参考上文

按照员工姓名进行优先级排序,所以打印顺序AAA、BBB、CCC、DDD、EEE、FFF

Employee [id=1, name=AAA, dob=2021-03-25]
Employee [id=5, name=BBB, dob=2021-03-25]
Employee [id=4, name=CCC, dob=2021-03-25]
Employee [id=3, name=DDD, dob=2021-03-25]
Employee [id=6, name=EEE, dob=2021-03-25]
Employee [id=2, name=FFF, dob=2021-03-25]

以上就是java并发编程工具类PriorityBlockingQueue优先级队列的详细内容,更多关于java并发PriorityBlockingQueue队列的资料请关注脚本之家其它相关文章!

相关文章

  • SpringMvc使用GoogleKaptcha生成验证码

    SpringMvc使用GoogleKaptcha生成验证码

    这篇文章主要为大家详细介绍了SpringMvc项目中使用GoogleKaptcha 生成验证码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • 通过Java实现添加或删除PDF中的附件

    通过Java实现添加或删除PDF中的附件

    当我们在制作PDF文件或者PPT演示文稿的时候,为了让自己的文件更全面详细,就会在文件中添加附件。本文为大家整理了Java实现添加或删除PDF中的附件的方法,需要的可以参考下
    2023-01-01
  • Spring MVC异步上传、跨服务器上传和文件下载功能实现

    Spring MVC异步上传、跨服务器上传和文件下载功能实现

    这篇文章主要介绍了Spring MVC异步上传、跨服务器上传和文件下载功能实现,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • java基础的详细了解第九天

    java基础的详细了解第九天

    这篇文章对Java编程语言的基础知识作了一个较为全面的汇总,在这里给大家分享一下。需要的朋友可以参考,希望能给你带来帮助
    2021-08-08
  • 在netty中使用native传输协议的方法

    在netty中使用native传输协议的方法

    这篇文章主要介绍了在netty中使用native传输协议,这里我们只以Kqueue为例介绍了netty中native传输协议的使用,需要的朋友可以参考下
    2022-05-05
  • Dwr3.0纯注解(纯Java Code配置)配置与应用浅析一之零配置文件化

    Dwr3.0纯注解(纯Java Code配置)配置与应用浅析一之零配置文件化

    Dwr对我来说最重要的功能点就是反向Ajax调用,通俗来将就是后端可以直接调用前端的JS方法(只要在所能访问的范围内),这也就是Dwr的真正来由,当然它也有最基本的前端直接调用后端的特性,省去了我们经常的一般Ajax调用
    2016-04-04
  • Java多线程事务回滚@Transactional失效处理方案

    Java多线程事务回滚@Transactional失效处理方案

    这篇文章主要介绍了Java多线程事务回滚@Transactional失效处理方案,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-08-08
  • springboot整合RabbitMQ 中的 TTL实例代码

    springboot整合RabbitMQ 中的 TTL实例代码

    TTL 是 RabbitMQ 中一个消息或者队列的属性,表明一条消息或者该队列中的所有消息的最大存活时间,单位是毫秒,这篇文章主要介绍了springboot整合RabbitMQ 中的 TTL,需要的朋友可以参考下
    2022-09-09
  • java long 类型数据的赋值方式

    java long 类型数据的赋值方式

    这篇文章主要介绍了java long 类型数据的赋值方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • Java 同步锁(synchronized)详解及实例

    Java 同步锁(synchronized)详解及实例

    这篇文章主要介绍了Java 同步锁(synchronized)详解及实例的相关资料,需要的朋友可以参考下
    2017-03-03

最新评论