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: 使用雙向隊列實現的有界雙端阻塞隊列。雙端意味著可以像普通隊列一樣 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線程池隊列的資料請關註WalkonNet其它相關文章!

推薦閱讀: