PriorityBlockingQueue源码随笔

主要是为了方便记录使用,所以排版,内容可能比较随意,各位看官还请海涵。有问题还请多多交流

话不多说直接看

PriorityBlockingQueue源码随笔_第1张图片
类继承图
PriorityBlockingQueue源码随笔_第2张图片
属性图

从上图可以看出priorityBlockQueue主要是通过ReentrantLock以及notEmpty来实现阻塞功能,queue的实现方式为数组,通过平衡的二进制堆的方式实现优先级的排序。最低值在队列queue[0]中

下面是添加数据的方法

PriorityBlockingQueue源码随笔_第3张图片
offer方法

主要分两步

1.根据当前容量判断是否需要进行扩容

2.根据是否存在comparator进行不同的方法添加数据

3.添加完成后进行single方法调用唤醒等待线程

1.从offer方法中可以看出添加数据时,首先进行lock获取,然后判断是否需要扩容,具体扩容方式是当容量小于64时扩oldCap+2,大于64时扩展0.5*oldCap,可以看出容量比较小时是快速扩容的。具体实现方法如下

PriorityBlockingQueue源码随笔_第4张图片
扩容机制

2.根据是否存在comparator进行不同的方法添加数据,主要方法为siftUpComparable以及siftUpUsingComparator。

PriorityBlockingQueue源码随笔_第5张图片
两种方法比较

从上图可以看出两种方法几乎一致,都是先查找parent元素,然后进行compareTo方法,当不存在comparator时,使用元素自身compareTo方法进行比较,存在是使用自己的比较方法进行比较。根据比较结果判断是否进行交换。

接下来看获取方法

主要为poll(),take(),poll(long timeout, TimeUnit unit)

PriorityBlockingQueue源码随笔_第6张图片
poll()以及take()方法

从上面可以看出三个方法主要都是通过dequeue()进行数据获取,然后根据各自的方法特性进行直接返回,线程等待或者超时等待。


PriorityBlockingQueue源码随笔_第7张图片
dequeue方法

直接取第一个元素,然后通过是否有比较器进行从排序,这里只看siftDownComparable方法

PriorityBlockingQueue源码随笔_第8张图片
siftDownComparable

总体来说看PriorityBlockingQueue方法还是比较易懂的。

你可能感兴趣的:(PriorityBlockingQueue源码随笔)