Java線程池隊列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: 使用雙向隊列實現(xiàn)的有界雙端阻塞隊列。雙端意味著可以像普通隊列一樣 FIFO(先進先出),也可以像棧一樣 FILO(先進后出)。
LinkedBlockingDeque是一個基于鏈表的雙端阻塞隊列,和LinkedBlockingQueue類似,區(qū)別在于該類實現(xiàn)了Deque接口,而LinkedBlockingQueue實現(xiàn)了Queue接口。
LinkedBlockingDeque是一個可選容量的阻塞隊列,如果沒有設置容量,那么容量將是Int的最大值。
LinkedBlockingDeque的重要字段有如下幾個:
//隊列的頭節(jié)點 transient Node<E> first; //隊列的尾節(jié)點 transient Node<E> last; //隊列中元素的個數 private transient int count; //隊列中元素的最大個數 private final int capacity; //鎖 final ReentrantLock lock = new ReentrantLock(); //隊列為空時,阻塞take線程的條件隊列 private final Condition notEmpty = lock.newCondition(); //隊列滿時,阻塞put線程的條件隊列 private final Condition notFull = lock.newCondition();
從上面的字段,可以看到LinkedBlockingDeque內部只有一把鎖以及該鎖上關聯(lián)的兩個條件,所以可以推斷同一時刻只有一個線程可以在隊頭或者隊尾執(zhí)行入隊或出隊操作。可以發(fā)現(xiàn)這點和LinkedBlockingQueue不同,LinkedBlockingQueue可以同時有兩個線程在兩端執(zhí)行操作。
由于LinkedBlockingDeque是一個雙端隊列,所以就可以在隊頭執(zhí)行入隊和出隊操作,也可以在隊尾執(zhí)行入隊和出隊操作。
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的相同點在于:
- 基于鏈表
- 容量可選,不設置的話,就是Int的最大值
LinkedBlockingDeque和LinkedBlockingQueue的不同點在于:
- 雙端鏈表和單鏈表
- 不存在哨兵節(jié)點
- 一把鎖+兩個條件
以上就是Java線程池隊列LinkedBlockingDeque的詳細內容,更多關于Java線程池隊列的資料請關注腳本之家其它相關文章!
相關文章
MyEclipse 2016 CI 4新增BootStrap模板
MyEclipse2016是一款全球使用最為廣泛的企業(yè)級開發(fā)環(huán)境程序,這篇文章主要介紹了MyEclipse 2016 CI 4新增BootStrap模板的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-06-06Java與Node.js利用AES加密解密出相同結果的方法示例
這篇文章主要介紹了Java與Node.js利用AES加密解密出相同結果的方法,文中給出了詳細的示例代碼,相信對大家的學習或者工作能帶來一定的幫助,需要的朋友們下面來一起看看吧。2017-02-02Kotlin + Spring Boot 請求參數驗證的代碼實例
本篇文章主要介紹了Kotlin + Spring Boot 請求參數驗證的代碼實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07springboot項目中idea的pom.xml文件的引用標簽全部爆紅問題解決
這篇文章主要介紹了springboot項目中idea的pom.xml文件的引用標簽全部爆紅問題解決,本文通過圖文并茂的形式給大家介紹的非常詳細,需要的朋友參考下吧2023-12-12