Java線程池隊(duì)列LinkedBlockingDeque
正文
public enum QueueTypeEnum {
ARRAY_BLOCKING_QUEUE(1, "ArrayBlockingQueue"),
LINKED_BLOCKING_QUEUE(2, "LinkedBlockingQueue"),
DELAY_QUEUE(3, "DelayQueue"),
PRIORITY_BLOCKING_QUEUE(4, "PriorityBlockingQueue"),
SYNCHRONOUS_QUEUE(5, "SynchronousQueue"),
LINKED_TRANSFER_QUEUE(6, "LinkedTransferQueue"),
LINKED_BLOCKING_DEQUE(7, "LinkedBlockingDeque"),
VARIABLE_LINKED_BLOCKING_QUEUE(8, "VariableLinkedBlockingQueue"),
MEMORY_SAFE_LINKED_BLOCKING_QUEUE(9, "MemorySafeLinkedBlockingQueue");
}
LinkedBlockingDeque
LinkedBlockingDeque: 使用雙向隊(duì)列實(shí)現(xiàn)的有界雙端阻塞隊(duì)列。雙端意味著可以像普通隊(duì)列一樣 FIFO(先進(jìn)先出),也可以像棧一樣 FILO(先進(jìn)后出)。
LinkedBlockingDeque是一個(gè)基于鏈表的雙端阻塞隊(duì)列,和LinkedBlockingQueue類似,區(qū)別在于該類實(shí)現(xiàn)了Deque接口,而LinkedBlockingQueue實(shí)現(xiàn)了Queue接口。
LinkedBlockingDeque是一個(gè)可選容量的阻塞隊(duì)列,如果沒有設(shè)置容量,那么容量將是Int的最大值。
LinkedBlockingDeque的重要字段有如下幾個(gè):
//隊(duì)列的頭節(jié)點(diǎn) transient Node<E> first; //隊(duì)列的尾節(jié)點(diǎn) transient Node<E> last; //隊(duì)列中元素的個(gè)數(shù) private transient int count; //隊(duì)列中元素的最大個(gè)數(shù) private final int capacity; //鎖 final ReentrantLock lock = new ReentrantLock(); //隊(duì)列為空時(shí),阻塞take線程的條件隊(duì)列 private final Condition notEmpty = lock.newCondition(); //隊(duì)列滿時(shí),阻塞put線程的條件隊(duì)列 private final Condition notFull = lock.newCondition();
從上面的字段,可以看到LinkedBlockingDeque內(nèi)部只有一把鎖以及該鎖上關(guān)聯(lián)的兩個(gè)條件,所以可以推斷同一時(shí)刻只有一個(gè)線程可以在隊(duì)頭或者隊(duì)尾執(zhí)行入隊(duì)或出隊(duì)操作??梢园l(fā)現(xiàn)這點(diǎn)和LinkedBlockingQueue不同,LinkedBlockingQueue可以同時(shí)有兩個(gè)線程在兩端執(zhí)行操作。
由于LinkedBlockingDeque是一個(gè)雙端隊(duì)列,所以就可以在隊(duì)頭執(zhí)行入隊(duì)和出隊(duì)操作,也可以在隊(duì)尾執(zhí)行入隊(duì)和出隊(duì)操作。
public LinkedBlockingDeque() {
this(Integer.MAX_VALUE);
}
public LinkedBlockingDeque(int capacity) {
if (capacity <= 0) throw new IllegalArgumentException();
this.capacity = capacity;
}
public LinkedBlockingDeque(Collection<? extends E> c) {
this(Integer.MAX_VALUE);
final ReentrantLock lock = this.lock;
lock.lock(); // Never contended, but necessary for visibility
try {
for (E e : c) {
if (e == null)
throw new NullPointerException();
if (!linkLast(new Node<E>(e)))
throw new IllegalStateException("Deque full");
}
} finally {
lock.unlock();
}
}
LinkedBlockingDeque和LinkedBlockingQueue的區(qū)別
LinkedBlockingDeque和LinkedBlockingQueue的相同點(diǎn)在于:
- 基于鏈表
- 容量可選,不設(shè)置的話,就是Int的最大值
LinkedBlockingDeque和LinkedBlockingQueue的不同點(diǎn)在于:
- 雙端鏈表和單鏈表
- 不存在哨兵節(jié)點(diǎn)
- 一把鎖+兩個(gè)條件
以上就是Java線程池隊(duì)列LinkedBlockingDeque的詳細(xì)內(nèi)容,更多關(guān)于Java線程池隊(duì)列的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
MyEclipse 2016 CI 4新增BootStrap模板
MyEclipse2016是一款全球使用最為廣泛的企業(yè)級(jí)開發(fā)環(huán)境程序,這篇文章主要介紹了MyEclipse 2016 CI 4新增BootStrap模板的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06
使用springmvc臨時(shí)不使用視圖解析器的自動(dòng)添加前后綴
這篇文章主要介紹了使用springmvc臨時(shí)不使用視圖解析器的自動(dòng)添加前后綴,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
Java與Node.js利用AES加密解密出相同結(jié)果的方法示例
這篇文章主要介紹了Java與Node.js利用AES加密解密出相同結(jié)果的方法,文中給出了詳細(xì)的示例代碼,相信對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,需要的朋友們下面來一起看看吧。2017-02-02
Kotlin + Spring Boot 請(qǐng)求參數(shù)驗(yàn)證的代碼實(shí)例
本篇文章主要介紹了Kotlin + Spring Boot 請(qǐng)求參數(shù)驗(yàn)證的代碼實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07
springboot項(xiàng)目中idea的pom.xml文件的引用標(biāo)簽全部爆紅問題解決
這篇文章主要介紹了springboot項(xiàng)目中idea的pom.xml文件的引用標(biāo)簽全部爆紅問題解決,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),需要的朋友參考下吧2023-12-12
關(guān)于java String中intern的深入講解
這篇文章主要給大家介紹了關(guān)于java String中intern的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04

