队列通常是先进先出的,而PriorityQueue是按照元素的优先级从小到大出队列的。正因为如此,
PriorityQueue中的2个元素之间需要可以比较大小,并实现Comparable接口
因为使用PriorityBlockingQueue中默认比较器,当数据无法比较,这是需要我们自定义比较器
package com.java.test.prioritys.blockings.queues; import lombok.Builder; import lombok.Data; /** * @author yourheart * @Description * @create 2022-11-16 23:24 */ @Data @Builder public class User implements Comparable<User> { private String number; private String name; @Override public int compareTo(User o) { if (this.number.charAt(0) == o.getNumber().charAt(0)) { return this.number.compareTo(o.getNumber()); } if (this.number.charAt(0) == 'V') { return -1; } else { return 1; } } }
@Test public void userTest(){ PriorityBlockingQueue<User> queue = new PriorityBlockingQueue<>(); queue.add(User.builder().number("A13").name("小白").build()); queue.add(User.builder().number("V13").name("小红").build()); queue.add(User.builder().number("A23").name("小绿").build()); queue.add(User.builder().number("V33").name("小红").build()); for (int i=0;i<4;i++){ User poll = queue.poll(); log.info("poll:{}",poll); } }
put中使用的是offer方法
和ArrayBlockingQueu区别不大,主要不同是用数组实现了一个二叉堆,实现队列按优先级从小到大出队列,队列长度不够后,自动扩容,生产者不用考虑阻塞问题