首頁 > 軟體

Java執行緒池佇列LinkedBlockingDeque

2022-12-13 14:00:22

正文

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: 使用雙向佇列實現的有界雙端阻塞佇列。雙端意味著可以像普通佇列一樣 FIFO(先進先出),也可以像棧一樣 FILO(先進後出)。

LinkedBlockingDeque是一個基於連結串列的雙端阻塞佇列,和LinkedBlockingQueue類似,區別在於該類實現了Deque介面,而LinkedBlockingQueue實現了Queue介面。

LinkedBlockingDeque是一個可選容量的阻塞佇列,如果沒有設定容量,那麼容量將是Int的最大值。

LinkedBlockingDeque的重要欄位有如下幾個:

//佇列的頭節點
transient Node<E> first;
//佇列的尾節點
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內部只有一把鎖以及該鎖上關聯的兩個條件,所以可以推斷同一時刻只有一個執行緒可以在隊頭或者隊尾執行入隊或出隊操作。可以發現這點和LinkedBlockingQueue不同,LinkedBlockingQueue可以同時有兩個執行緒在兩端執行操作。

由於LinkedBlockingDeque是一個雙端佇列,所以就可以在隊頭執行入隊和出隊操作,也可以在隊尾執行入隊和出隊操作。

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的區別

LinkedBlockingDeque和LinkedBlockingQueue的相同點在於:

  • 基於連結串列
  • 容量可選,不設定的話,就是Int的最大值

LinkedBlockingDeque和LinkedBlockingQueue的不同點在於:

  • 雙端連結串列和單連結串列
  • 不存在哨兵節點
  • 一把鎖+兩個條件

以上就是Java執行緒池佇列LinkedBlockingDeque的詳細內容,更多關於Java執行緒池佇列的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com