📌  相关文章
📜  Java中的BlockingDeque(1)

📅  最后修改于: 2023-12-03 15:31:56.837000             🧑  作者: Mango

Java中的BlockingDeque

在Java中,BlockingDeque是一种实现了BlockingQueue接口和Deque接口的双端队列,它支持在队列的头尾两端插入和删除元素,并且在队列为空或已满时提供了阻塞等待的能力。

构造方法

BlockingDeque接口提供了三个实现类:ArrayBlockingDequeLinkedBlockingDequeLinkedBlockingDeque,其中,ArrayBlockingDequeLinkedBlockingDeque在构造方法中需要指定队列的容量,而LinkedBlockingDeque则可以不指定容量。下面是一些常用的构造方法:

ArrayBlockingDeque
BlockingDeque<E> deque = new ArrayBlockingDeque<>(capacity);

其中,capacity为队列的容量。

LinkedBlockingDeque
BlockingDeque<E> deque = new LinkedBlockingDeque<>();
常用方法
插入元素

BlockingDeque提供了多个方法用于在队列的头尾插入元素:

  • addFirst(E e):在队列头插入元素,如果队列已满,则抛出IllegalStateException异常。
  • addLast(E e):在队列尾插入元素,如果队列已满,则抛出IllegalStateException异常。
  • offerFirst(E e):在队列头插入元素,如果队列已满,则返回false
  • offerLast(E e):在队列尾插入元素,如果队列已满,则返回false
  • putFirst(E e):在队列头插入元素,如果队列已满,则线程进入阻塞等待状态。
  • putLast(E e):在队列尾插入元素,如果队列已满,则线程进入阻塞等待状态。
删除元素

BlockingDeque也提供了多个方法用于在队列的头尾删除元素:

  • removeFirst():删除队列头元素,如果队列为空,则抛出NoSuchElementException异常。
  • removeLast():删除队列尾元素,如果队列为空,则抛出NoSuchElementException异常。
  • pollFirst():删除队列头元素,如果队列为空,则返回null
  • pollLast():删除队列尾元素,如果队列为空,则返回null
  • takeFirst():删除队列头元素,如果队列为空,则线程进入阻塞等待状态。
  • takeLast():删除队列尾元素,如果队列为空,则线程进入阻塞等待状态。
检查元素

BlockingDeque提供了多个方法用于检查队列的头尾元素:

  • getFirst():返回队列头元素,如果队列为空,则抛出NoSuchElementException异常。
  • getLast():返回队列尾元素,如果队列为空,则抛出NoSuchElementException异常。
  • peekFirst():返回队列头元素,如果队列为空,则返回null
  • peekLast():返回队列尾元素,如果队列为空,则返回null
其他方法

BlockingDeque还提供了一些其他方法,例如:

  • size():返回队列中元素的个数。
  • isEmpty():判断队列是否为空。
  • isFull():判断队列是否已满。
  • iterator():返回一个队列元素的迭代器。
使用示例

下面是一个使用BlockingDeque的示例代码:

public class BlockingDequeExample {

    public static void main(String[] args) throws InterruptedException {
        int capacity = 5;
        BlockingDeque<String> deque = new LinkedBlockingDeque<>(capacity);

        deque.putFirst("A");
        deque.putLast("B");
        deque.offerLast("C");
        deque.offerFirst("D");
        deque.offerLast("E");

        System.out.println("队列中元素的个数:" + deque.size());
        while (!deque.isEmpty()) {
            System.out.println("队列头元素:" + deque.takeFirst());
        }
    }
}

输出结果为:

队列中元素的个数:5
队列头元素:D
队列头元素:A
队列头元素:B
队列头元素:C
队列头元素:E