作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO
联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬
学习必须往深处挖,挖的越深,基础越扎实!
阶段1、深入多线程
阶段2、深入多线程设计模式
阶段3、深入juc源码解析
码哥源码部分
码哥讲源码-原理源码篇【2024年最新大厂关于线程池使用的场景题】
码哥讲源码-原理源码篇【揭秘join方法的唤醒本质上决定于jvm的底层析构函数】
码哥源码-原理源码篇【Doug Lea为什么要将成员变量赋值给局部变量后再操作?】
码哥讲源码【谁再说Spring不支持多线程事务,你给我抽他!】
打脸系列【020-3小时讲解MESI协议和volatile之间的关系,那些将x86下的验证结果当作最终结果的水货们请闭嘴】
一、PriorityBlockingQueue简介
PriorityBlockingQueue
,是在JDK1.5时,随着J.U.C包引入的一种阻塞队列,它实现了 BlockingQueue 接口,底层基于 堆 实现:
PriorityBlockingQueue是一种 无界阻塞队列 ,在构造的时候可以指定队列的初始容量。具有如下特点:
- PriorityBlockingQueue与之前介绍的阻塞队列最大的不同之处就是:它是一种 优先级队列 ,也就是说元素并不是以FIFO的方式出/入队,而是以按照权重大小的顺序出队;
- PriorityBlockingQueue是真正的无界队列(仅受内存大小限制),它不像ArrayBlockingQueue那样构造时必须指定最大容量,也不像LinkedBlockingQueue默认最大容量为
Integer.MAX_VALUE
; - 由于PriorityBlockingQueue是按照元素的权重进入排序,所以队列中的元素必须是可以比较的,也就是说元素必须实现
Comparable
接口; - 由于PriorityBlockingQueue无界队列,所以插入元素永远不会阻塞线程;
- PriorityBlockingQueue底层是一种 基于数组实现的堆结构 。
注意 :堆分为“大顶堆”和“小顶堆”,PriorityBlockingQueue会依据元素的比较方式选择构建大顶堆或小顶堆。比如:如果元素是Integer这种引用类型,那么默认就是“小顶堆”,也就是每次出队都会是当前队列最小的元素。
二、PriorityBlockingQueue原理
2.1 构造
PriorityBlockingQueue提供了四种构造器:
/**
* 默认构造器.