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是一個可選容量的阻塞隊列,如果沒有設(shè)置容量,那么容量將是Int的最大值。
LinkedBlockingDeque的重要字段有如下幾個:
//隊列的頭節(jié)點 transient Node<E> first; //隊列的尾節(jié)點 transient Node<E> last; //隊列中元素的個數(shù) private transient int count; //隊列中元素的最大個數(shù) private final int capacity; //鎖 final ReentrantLock lock = new ReentrantLock(); //隊列為空時,阻塞take線程的條件隊列 private final Condition notEmpty = lock.newCondition(); //隊列滿時,阻塞put線程的條件隊列 private final Condition notFull = lock.newCondition();
從上面的字段,可以看到LinkedBlockingDeque內(nèi)部只有一把鎖以及該鎖上關(guān)聯(lián)的兩個條件,所以可以推斷同一時刻只有一個線程可以在隊頭或者隊尾執(zhí)行入隊或出隊操作??梢园l(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的相同點在于:
- 基于鏈表
- 容量可選,不設(shè)置的話,就是Int的最大值
LinkedBlockingDeque和LinkedBlockingQueue的不同點在于:
- 雙端鏈表和單鏈表
- 不存在哨兵節(jié)點
- 一把鎖+兩個條件
以上就是Java線程池隊列LinkedBlockingDeque的詳細內(nèi)容,更多關(guān)于Java線程池隊列的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Springboot靜態(tài)資源訪問實現(xiàn)代碼解析
這篇文章主要介紹了Springboot靜態(tài)資源訪問實現(xiàn)代碼解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友可以參考下2020-06-06
Java實現(xiàn)讀取TXT和CSV文件內(nèi)容
這篇文章主要為大家詳細介紹了如何利用Java語言實現(xiàn)讀取TXT和CSV文件內(nèi)容的功能,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下2023-02-02
springboot+mybatis配置控制臺打印sql日志的方法
這篇文章主要介紹了springboot+mybatis配置控制臺打印sql日志的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧2020-08-08
基于jdk動態(tài)代理和cglib動態(tài)代理實現(xiàn)及區(qū)別說明
這篇文章主要介紹了基于jdk動態(tài)代理和cglib動態(tài)代理實現(xiàn)及區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-05-05
SpringBoot文件上傳控制及Java 獲取和判斷文件頭信息
這篇文章主要介紹了SpringBoot文件上傳控制的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-12-12
java如何獲取request中json數(shù)據(jù)
這篇文章主要給大家介紹了關(guān)于java如何獲取request中json數(shù)據(jù)的相關(guān)資料,文中通過代碼示例以及圖文將獲取的方法介紹的非常詳細,對大家學(xué)習或者使用java具有一定的參考借鑒價值,需要的朋友可以參考下2023-08-08
MyBatisCodeHelperPro最新激活方法(有效方法)
這篇文章主要介紹了MyBatisCodeHelperPro最新激活方法親測有效,非常好用,小編今天以idea2021.2.1為例給大家詳細講解,需要的朋友可以參考下2022-08-08

