java中PriorityBlockingQueue的入隊(duì)知識點(diǎn)總結(jié)
在PriorityBlockingQueue中添加元素同樣有四種方法,因?yàn)槭菢錉畹慕Y(jié)構(gòu),所以在插入方法上也有所變化,是自下而上的操作過程。在入隊(duì)的規(guī)則上有三個(gè)要點(diǎn)需要我們注意。鑒于PriorityBlockingQueue入隊(duì)方法主要通過offer(E)實(shí)現(xiàn),所以我們就這種方法作主要講解。
1.入隊(duì)規(guī)則
(1)默認(rèn)的插入規(guī)則中,新加入的元素可能會破壞小頂堆的性質(zhì),因此需要進(jìn)行調(diào)整。
(2)調(diào)整的過程為:從尾部下標(biāo)的位置開始,將加入的元素逐層與當(dāng)前點(diǎn)的父節(jié)點(diǎn)的內(nèi)容進(jìn)行比較并交換,直到滿足父節(jié)點(diǎn)內(nèi)容都小于子節(jié)點(diǎn)的內(nèi)容為止。
(3)默認(rèn)的刪除調(diào)整中,首先獲取頂部下標(biāo)和最尾部的元素內(nèi)容,從頂部的位置開始,將尾部元素的內(nèi)容逐層向下與當(dāng)前點(diǎn)的左右子節(jié)點(diǎn)中較小的那個(gè)交換,直到判斷元素內(nèi)容小于或等于左右子節(jié)點(diǎn)中的任何一個(gè)為止。
2.入隊(duì)方法
入隊(duì)方法有:add(E), put(E), offer(E, timeout, TimeUnit), offer(E)
public void put(E e) {
offer(e); // never need to block
}
public boolean offer(E e) {
//判斷是否為空
if (e == null)
throw new NullPointerException();
//顯示鎖
final ReentrantLock lock = this.lock;
lock.lock();
//定義臨時(shí)對象
int n, cap;
Object[] array;
//判斷數(shù)組是否滿了
while ((n = size) >= (cap = (array = queue).length))
//數(shù)組擴(kuò)容
tryGrow(array, cap);
try {
//拿到比較器
Comparator<? super E> cmp = comparator;
//判斷是否有自定義比較器
if (cmp == null)
//堆上浮
siftUpComparable(n, e, array);
else
//使用自定義比較器進(jìn)行堆上浮
siftUpUsingComparator(n, e, array, cmp);
//隊(duì)列長度 +1
size = n + 1;
//喚醒休眠的出隊(duì)線程
notEmpty.signal();
} finally {
//釋放鎖
lock.unlock();
}
return true;
}
可以看出前三個(gè)方法內(nèi)部都是通過 offer(e) 方法實(shí)現(xiàn)的。
- Java并發(fā)包中的PriorityBlockingQueue深度解析
- Java線程池隊(duì)列PriorityBlockingQueue原理分析
- Java的PriorityBlockingQueue優(yōu)先級阻塞隊(duì)列代碼實(shí)例
- 詳解Java并發(fā)編程中的優(yōu)先級隊(duì)列PriorityBlockingQueue
- Java線程池隊(duì)列PriorityBlockingQueue和SynchronousQueue詳解
- java并發(fā)編程工具類PriorityBlockingQueue優(yōu)先級隊(duì)列
- Java中PriorityBlockingQueue的使用
相關(guān)文章
Java程序生成exe可執(zhí)行文件詳細(xì)教程(圖文說明)
這篇文章主要介紹了Java程序生成exe可執(zhí)行文件詳細(xì)教程,有需要的朋友可以參考一下2013-12-12
Spring?Security如何實(shí)現(xiàn)升級密碼加密方式詳解
這篇文章主要為大家介紹了Spring?Security實(shí)現(xiàn)升級密碼加密方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
Java 中的 equals 和 hashCode 方法關(guān)系與正確重寫
在Java中,equals和 hashCode方法是Object類的核心方法,廣泛用于對象比較和哈希集合(如 HashMap、HashSet)的操作,本文深入剖析equals和hashCode方法的關(guān)系、契約、正確重寫方式及實(shí)踐案例,感興趣的朋友一起看看吧2025-09-09
SpringBoot集成Caffeine緩存的實(shí)現(xiàn)步驟
Caffeine cache是一個(gè)針對Java的高性能緩存庫。在本文中,我們將介紹它與Spring Boot如何一起使用。2021-05-05
SpringBoot獲取application.properties文件中文亂碼問題及解決
這篇文章主要介紹了SpringBoot獲取application.properties文件中文亂碼問題及解決,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
Spring Cloud Ribbon客戶端詳細(xì)介紹
Spring Cloud Ribbon 是一套基于 Netflix Ribbon 實(shí)現(xiàn)的客戶端負(fù)載均衡和服務(wù)調(diào)用工具。通過Spring Cloud的封裝,可以讓我們輕松地將面向服務(wù)的REST模版請求自動轉(zhuǎn)換成客戶端負(fù)載均衡的服務(wù)調(diào)用2022-09-09
mybatis-plus動態(tài)表名實(shí)現(xiàn)方法
本文主要介紹了mybatis-plus動態(tài)表名實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
Java中IO流 RandomAccessFile類實(shí)例詳解
這篇文章主要介紹了Java中IO流 RandomAccessFile類實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-05-05

