本文翻译自http://tutorials.jenkov.com/java-util-concurrent/blockingdeque.html,机翻加人工校正,仅供学习交流。
BlockingDeque
在java.util.concurrent包中,BlockingDeque接口是一个线程安全的插入和取出的双向队列。在本文中,我将向您展示如何使用BlockingDeque。
BlockingDeque是一个阻塞线程插入或删除元素的双向队列,如果不能从双向队列中插入或删除元素。
deque是“双尾队列”的缩写。因此,deque是一个队列,您可以从两端插入和获取元素。
BlockingDeque用法
BlockingDeque用在线程生产和消费元素在同一个队列的情况下,也可以用于生产线程需要插入队列的两端,消费线程需要消费队列的两端,下面是示意图:
一个线程生产元素并将元素插入到队列任意一端。如果队列容量满了,生产线程将会阻塞,直到消费线程从双向队列中消费元素。如果双向队列是空的,消费线程将会会被阻塞,直到生产线程往里面插入元素。
BlockingDeque的方法
BlockingDeque有从双向队列中插入、移除和检查分别有四种不同的方法。当请求操作不能立马执行,每种方法将会有不同表现。这是方法的表格:
4种不同行为的意义:
- Throws Exception:如果请求不能立即执行,抛出一个异常。
- Special Value:如果请求不能立即执行,返回特定的值(true/false)。
- Blocks:如果请求不能立即执行,请求将会阻塞。
- Times out:如果请求不能立即执行,请求将会阻塞,等待不会超过给定的时间。返回一个指定的值告诉操作是否成功。
阻塞双向队列继承阻塞队列
BlockingDeque接口继承BlockingQueue接口,这意味着可以将BlockingDeque当做BlokcingQueue使用。如果你这样做,不同的插入方法添加元素到双向队列的末端,移除方法将从双向队列的开端移除元素。BlockingQueue接口的插入和移除方法,下面表格展示BlockingQueue的方法在BlockingDeque的实现类中如何做的。
BlockingDeque的实现类
因为BlockingDeque是个接口,所以必需使用其实现类来使用它。java.util.concurrent包里有以下实现BlockingDeque的类:
LinkedBlockingDeque
BlockingDeque代码示例
下面是一段如何使用BlockingDeque的代码示例:
BlockingDeque<String> deque = new LinkedBlockingDeque<String>();
deque.addFirst("1");
deque.addLast("2");
String two = deque.takeLast();
String one = deque.takeFirst();