图解PriorityBlockingQueue源码(java 8)

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值