BlockingDeque
接口是java.util.concurrent
包中安全的放入和取实例的双向队列的代表。
这篇文章介绍了BlockingDeque
的用法
.
BlockingDeque类是一个Deque,当线程试图从Deque中插入或删除元素可能会阻塞。
Deque是“双端队列”的缩写。因此, deque
是一个两端都可以插入或者取元素的队列
.
BlockingDeque用法
如果一个线程既要向队列中添加元素,又要从同一个队列中取元素,那么BlockingDeque将是非常有用的。如果消费者线程既要从队列的头部取元素,也要从队列的尾部取元素;或者生产者线程需要插入元素到队列的两端,那么BlockingDeque也是非常有用的。
下图是描述:
BlockingDeque:线程可以从两端插入,取出元素 |
一个线程可以插入元素到队列的任一端。如果队列full,那么线程将会阻塞,直到其他线程从队列中取出一个元素为止。如果队列empty,那么从队列中取元素的线程将会阻塞,直到其他线程插入一个元素为止。
BlockingDeque的方法
BlockingDeque有4类方法,可以插入,删除,执行队列中的元素。
如果无法立即执行请求的操作,则每组方法的行为都不同。
下表是方法:
| Throws Exception | Special Value | Blocks | Times Out |
Insert |
|
|
|
|
Remove |
|
|
|
|
Examine |
|
|
|
|
| Throws Exception | Special Value | Blocks | Times Out |
Insert |
|
|
|
|
Remove |
|
|
|
|
Examine |
|
|
|
|
4中方法不同的行为:
- Throws Exception:
如果操作不能立即被执行,那么将抛出异常. - Special Value:
如果操作不能被立即执行,那么将返回一个异常值(一般情况下是true/false) - Blocks:
如果操作不能被立即执行,那么操作将会阻塞,直至可以执行。 - Times Out:
如果操作不能被立即执行,那么操作将会阻塞,直至可以执行,或者超时时间到。函数的返回值说明了操作是否执行成功。
BlockingDeque继承BlockingQueue
BlockingDeque
接口继承了 BlockingQueue
接口. 这意味着可以把BlockingDeque
当着BlockingQueue
用. 如果你使用BlockingDeque作为BlockingQueue,那么BlockingQueue的插入操作就是把元素插入到BlockDeque的尾部。移出操作将是移出BlockDeque头部的元素
下面是BlockingDeque
实现了 BlockingQueue
中的一些方法:
BlockingQueue | BlockingDeque |
add() | addLast() |
offer() x 2 | offerLast() x 2 |
put() | putLast() |
|
|
remove() | removeFirst() |
poll() x 2 | pollFirst() |
take() | takeFirst() |
|
|
element() | getFirst() |
peek() | peekFirst() |
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();
参考翻译:http://tutorials.jenkov.com/java-util-concurrent/blockingdeque.html