java.util.concurrent
中的BlockingDeque
接口表示一个双向队列,它可以被线程安全的放入以及从中获取实例。在本文中,我将向你展示如何使用BlockingDeque
。
BlockingDeque
类是一个Deque
,它会阻塞尝试在deque中插入或删除的线程,以防它能够向队列中插入或删除元素。
deque是“Double Ended Queue”(双端队列)的缩写。因此,deque是一个队列,你可以从它的两端插入和获取元素。
BlockingDeque 用法
如果线程同时生成和使用同一队列的元素,则可以使用BlockingDeque
。如果生成线程需要在队列的两端插入元素,并且消费线程需要从队列的两端移除元素,那么也可以使用它:
线程将生成元素并将它们插入队列的任一端。如果deque当前已满,则插入线程将被阻塞,直到删除线程将元素从双端队列中取出。如果deque当前为空,则将阻止删除线程,直到插入线程将元素插入到双端队列中。
BlockingDeque 方法
BlockingDeque
有4组不同的方法用于插入,移除以及检查双端队列中的元素。如果不能立即执行所请求的操作,则每组方法的行为都不同。这是一个方法表:
抛出异常 | 返回特殊值 | 阻塞 | 超时 | |
---|---|---|---|---|
Insert | addFirst(o) |
offerFirst(o) |
putFirst(o) |
offerFirst(o, timeout, timeunit) |
Remove | removeFirst(o) |
pollFirst(o) |
takeFirst(o) |
pollFirst(timeout, timeunit) |
Examine | getFirst(o) |
peekFirst(o) |
抛出异常 | 返回特殊值 | 阻塞 | 超时 | |
---|---|---|---|---|
Insert | addLast(o) |
offerLast(o) |
putLast(o) |
offerLast(o, timeout, timeunit) |
Remove | removeLast(o) |
pollLast(o) |
takeLast(o) |
pollLast(timeout, timeunit) |
Examine | getLast(o) |
peekLast(o) |
这与BlockingQueue
类似,只多了一组方法。
BlockingDeque 继承自 BlockingQueue
BlockingDeque
接口扩展BlockingQueue
接口。这意味着你可以使用BlockingDeque
作为BlockingQueue
。如果这样做,各种插入方法会将元素添加到双端队列的末尾,而删除方法将从双端队列的开头删除元素,即BlockingQueue
接口的插入和删除方法。
下面是一个表格,对应了BlockingQueue
和BlockingDeque
的方法:
BlockingQueue | BlockingDeque |
---|---|
add() | addLast() |
offer() x 2 | offerLast() x 2 |
put() | putLast() |
remove() | removeFirst() |
poll() x 2 | pollFirst() x 2 |
take() | takeFirst() |
element() | getFirst() |
peek() | peekFirst() |
BlockingDeque 实现
由于BlockingDeque
是一个接口,你需要使用其中的一个实现类来使用它。java.util.concurrent
包具有以下BlockingDeque
接口的实现:
BlockingDeque 代码示例
这是一个如何使用BlockingDeque
方法的小代码示例:
BlockingDeque<String> deque = new LinkedBlockingDeque<String>();
deque.addFirst("1");
deque.addLast("2");
String two = deque.takeLast();
String one = deque.takeFirst();