文章译自:http://tutorials.jenkov.com/java-util-concurrent/index.html
抽空翻译了一下这个教程的文章,后面会陆续放出,如有不妥,请批评指正。
转自请注明出处。
BlockingDeque
Java.util.concruuent包中的BlockingDeque接口是一种双端队列,向其中加入元素或从中取出元素都是线程安全的。这里展示如何使用BlockingDeque。
BlockingDeque是一个双端队列,如果完全不可能对双端队列进行插入或者删除元素,它将会阻塞线程。
deque 是 “Double Ended Queue”的简称。因此一个deque可以从两端插入和取出元素的。
BlockingDeque使用说明
BlockingDeque用于一个线程对同个一个双端队列进行生产和消费元素。也常用于生产线程需要在队列两端插入元素,消费线程需要从队列两端移除元素,下面是一个图示:
一个线程生产元素并将元素插入到队列的两端。如果当前队列是满的,插入线程将会被阻塞直到一个移除元素的线程从队列中取出一个元素。同样,如果队列当前是空的,移除元素的线程会被阻塞直到一个插入元素的线程向队列中插入了一个元素。
BlockingDeque的方法
对于在队列中插入、删除和检查元素操作BlockingQueue有4类不同的方法。如果操作不能立即执行,每一类方法的行为将不同。下面是方法列表:
operation | Throws Exception | Special Value | Blocks | Times Out |
---|---|---|---|---|
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) |
对于4种不同行为的说明参见BlockingQueuez中的说明。
BlockingDeque继承自BlockingQueue
BlockingDeque接口继承自BlockingQueue接口。这意味着你可以把BlockingDeque作为BlockingQueue来使用。如果你这样做,那么各种插入元素的方法将会把元素增加到队列的尾部,并且将会从队列的头部开始移除元素。
下面的列表列出了BlockingQueue方法在BlockingDeque中的实现。
BlockingDeque | BlockingQueue |
---|---|
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<String> deque = new LinkedBlockingDeque<String>();
deque.addFirst("1");
deque.addLast("2");
String two = deque.takeLast();
String one = deque.takeFirst();
LinkedBlockingDeque
LinkedBlockingDeque类实现了BlockingDeque接口。
LinkedBlockingDeque是一个双端队列,如果一个线程试图从一个空的队列中取出元素,它将被阻塞住,不管线程是从哪一端去获取元素。
下面是展示如何实例化和使用LinkedBlockingDeque:
BlockingDeque<String> deque = new LinkedBlockingDeque<String>();
deque.addFirst("1");
deque.addLast("2");
String two = deque.takeLast();
String one = deque.takeFirst();