13. BlockingDeque

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接口的插入和删除方法。

下面是一个表格,对应了BlockingQueueBlockingDeque的方法:

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();
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容