关于spring:java并发编程工具类JUC第五篇PriorityBlockingQueue优先级队列

3次阅读

共计 2963 个字符,预计需要花费 8 分钟才能阅读完成。

在之前的文章中曾经为大家介绍了 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]

.

欢送关注我的博客,外面有很多精品合集

本文转载注明出处(必须带连贯,不能只转文字):字母哥博客 – zimug.com

感觉对您有帮忙的话,帮我点赞、分享!您的反对是我不竭的创作能源!。另外,笔者最近一段时间输入了如下的精品内容,期待您的关注。

  • 《手摸手教你学 Spring Boot2.0》
  • 《Spring Security-JWT-OAuth2 一本通》
  • 《实战前后端拆散 RBAC 权限管理系统》
  • 《实战 SpringCloud 微服务从青铜到王者》
  • 《VUE 深入浅出系列》
正文完
 0