📅  最后修改于: 2023-12-03 15:31:56.837000             🧑  作者: Mango
在Java中,BlockingDeque
是一种实现了BlockingQueue
接口和Deque
接口的双端队列,它支持在队列的头尾两端插入和删除元素,并且在队列为空或已满时提供了阻塞等待的能力。
BlockingDeque
接口提供了三个实现类:ArrayBlockingDeque
、LinkedBlockingDeque
和LinkedBlockingDeque
,其中,ArrayBlockingDeque
和LinkedBlockingDeque
在构造方法中需要指定队列的容量,而LinkedBlockingDeque
则可以不指定容量。下面是一些常用的构造方法:
BlockingDeque<E> deque = new ArrayBlockingDeque<>(capacity);
其中,capacity
为队列的容量。
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