主要是為了方便記錄使用熟吏,所以排版,內(nèi)容可能比較隨意玄窝,各位看官還請海涵牵寺。有問題還請多多交流
話不多說直接看
從上圖可以看出priorityBlockQueue主要是通過ReentrantLock以及notEmpty來實現(xiàn)阻塞功能,queue的實現(xiàn)方式為數(shù)組恩脂,通過平衡的二進制堆的方式實現(xiàn)優(yōu)先級的排序帽氓。最低值在隊列queue[0]中
下面是添加數(shù)據(jù)的方法
主要分兩步
1.根據(jù)當前容量判斷是否需要進行擴容
2.根據(jù)是否存在comparator進行不同的方法添加數(shù)據(jù)
3.添加完成后進行single方法調(diào)用喚醒等待線程
1.從offer方法中可以看出添加數(shù)據(jù)時,首先進行l(wèi)ock獲取俩块,然后判斷是否需要擴容黎休,具體擴容方式是當容量小于64時擴oldCap+2,大于64時擴展0.5*oldCap浓领,可以看出容量比較小時是快速擴容的。具體實現(xiàn)方法如下
2.根據(jù)是否存在comparator進行不同的方法添加數(shù)據(jù)奋渔,主要方法為siftUpComparable以及siftUpUsingComparator镊逝。
從上圖可以看出兩種方法幾乎一致,都是先查找parent元素嫉鲸,然后進行compareTo方法撑蒜,當不存在comparator時,使用元素自身compareTo方法進行比較玄渗,存在是使用自己的比較方法進行比較座菠。根據(jù)比較結果判斷是否進行交換。
接下來看獲取方法
主要為poll(),take(),poll(long timeout, TimeUnit unit)
從上面可以看出三個方法主要都是通過dequeue()進行數(shù)據(jù)獲取藤树,然后根據(jù)各自的方法特性進行直接返回浴滴,線程等待或者超時等待。
直接取第一個元素岁钓,然后通過是否有比較器進行從排序升略,這里只看siftDownComparable方法
總體來說看PriorityBlockingQueue方法還是比較易懂的。