PriotityBlockingQueue源码解析
PriotityBlockingQueue是待优先级的无界阻塞队列,每次出队都返回优先级最高或者最低的元素。其内部是使用平衡二叉树堆实现的,所以直接遍历队列元素不保证有序。默认使用对象的compareTo方法提供比较规则,如果需要自定义比较规则,可以自定义Comparators。
类图
PriotityBlockingQueue的类图如下所示:
PriotityBlockingQueue实现了BlockingQueue接口和继承了AbstractQueue类。
1 | public class PriorityBlockingQueue<E> extends AbstractQueue<E> |
BlockingQueue接口只是定义了一些阻塞队列的公共方法,如下:
1 | public interface BlockingQueue<E> extends Queue<E> { |
AbstractQueue也实现了Queue接口,还提供了某些方法的默认实现
1 | // 从这可以发现,Add方法,其实就是调用的offer方法 |
主要属性
1 | /** |
主要方法
无参构造函数
1 | /** |
创建一个默认大小为11的优先级阻塞队列,使用默认比较器
有参构造函数-指定大小
1 | /** |
生成一个指定大小的队列,使用默认比较器
有参构造函数-指定比较器
1 | /** |
指定队列大小,以及比较器
有参构造函数-指定集合
根据指定集合创建一个优先级队列,如果指定的集合是SortedSet或者是另外一个PriorityQueue,那么就会保持原集合的排序顺序。否则按照Comparator指定的排序规则或者自然排序
1 | /** |
size方法
1 | public int size() { |
锁定,返回大小,解锁
remainingCapacity方法
返回Integer.MAX_VALUE.等同于没有边界
1 | /** |
put方法
内部调用offer方法
1 | /** |
offer方法
添加一个元素到队列,因为队列是无界的,所以,该方法永不会返回false.
添加成功之后,唤醒等待的获取线程
1 | /** |
tryGrow
1 | /** |
siftUpComparable
父节点的索引是叶子节点索引的两倍,比较父节点是否比子节点大,否则交换
1 | /** |
siftUpUsingComparator
使用自定义的比较器,其他同上
1 | private static <T> void siftUpUsingComparator(int k, T x, Object[] array, |
add方法
内部调用offer方法
1 | /** |
take方法
从队列中获取一个元素,并从队列中删除该元素,如果队列为空,阻塞当前线程
1 | public E take() throws InterruptedException { |
dequeue
取数组的第一个出队列,然后根据比较器是否为null,将首位置下沉。
1 | /** |
siftDownComparable
计算出子节点的位置,循环比较,如果子节点比父节点大,就跳出
1 | /** |
siftDownUsingComparator
1 | private static <T> void siftDownUsingComparator(int k, T x, Object[] array, |
poll方法
从队列中获取一个元素,并从队列中删除该元素,如果队列为空,直接返回null
1 | public E poll() { |
peek方法
从队列中获取一个元素,如果队列为空,直接返回null
1 | public E peek() { |
remove方法
从队列中删除指定的元素,有返回true,否则返回false
1 | /** |
removeAt
1 | /** |
contains方法
1 | /** |
indexOf
顺序遍历
1 | private int indexOf(Object o) { |