PriorityBlockingQueue
是一个带有优先级的阻塞队列。
基本原理和前面介绍的ArrayBlockingQueue
类似。
在看这篇文章之前,你可以先仔细看下这篇文章——ArrayBlockingQueue源码解析
PriorityBlockingQueue和ArrayBlockingQueue一样,初始化时,可指定队列的大小。
不同的是,前者可以自动扩容,而后者不会。
另一个很大不同是,前者可以实现优先出队,后者则是先进先出。
比如有这么一个场景,一个市场上陆陆续续来了很多卖苹果的。
这时来了一个大买家,说谁最便宜就买谁的。 先来后来无所谓。
static class SaleApple implements Comparable<SaleApple> {
int price; // 苹果的价格
String brand; // 草果的品种
SaleApple(int price, String brand){
this.price = price;
this.brand = brand;
}
@Override
public int compareTo(SaleApple o) {
return this.price - ((SaleApple) o).price;
}
}
public static void main(String[] args) throws Exception {
PriorityBlockingQueue<SaleApple> priorityQueue = new PriorityBlockingQueue<>(3);
Thread t1 = new Thread(new Runnable() {
@SneakyThrows
@Override
public void run() {
for (int i = 0; i < 10; i++) {
SaleApple apple = new SaleApple(RandomUtil.randomInt(5,50), "one_brandNo" + i);
boolean offer = priorityQueue.offer(apple);
log.info("one_offer:{}, value:{}", offer, apple.price);
}
}
}, "t1");
t1.start();
Thread.sleep(3000);
SaleApple apple = priorityQueue.take();
log.info(" price:{}, brand:{}", apple.price, apple.brand);
}
上面是一个小demo,PriorityBlockingQueue 就特别适合这样的场景,出队的就是最便宜的那个。
PriorityBlockingQueue 底层是利用 PriorityQueue
, 默认是小顶堆。
堆这种数据结构如果不熟悉,可以看我之前的博客——数据结构:堆(小顶堆和大顶堆)。
好,现在开始一点一点分析源码
一、初始化
public PriorityBlockingQueue(int initialCapacity,
Comparator<? super E> comparator