The BlockingDeque
interface in the java.util.concurrent
class represents a deque which is thread safe to put into, and take instances from. In this text I will show you how to use this BlockingDeque
.
The BlockingDeque
class is a Deque
which blocks threads tring to insert or remove elements from the deque, in case it is either not possible to insert or remove elements from the deque.
A deque
is short for "Double Ended Queue". Thus, a deque
is a queue which you can insert and take elements from, from both ends.
A BlockingDeque
could be used if threads are both producing and consuming elements of the same queue. It could also just be used if the producting thread needs to insert at both ends of the queue, and the consuming thread needs to remove from both ends of the queue. Here is an illustration of that:
A BlockingDeque - threads can put and take from both ends of the deque. |
A thread will produce elements and insert them into either end of the queue. If the deque is currently full, the inserting thread will be blocked until a removing thread takes an element out of the deque. If the deque is currently empty, a removing thread will be blocked until an inserting thread inserts an element into the deque.
A BlockingDeque
has 4 different sets of methods for inserting, removing and examining the elements in the deque. Each set of methods behaves differently in case the requested operation cannot be carried out immediately. Here is a table of the methods:
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) |
|
|
Throws Exception | Special Value | Blocks | Times Out | |
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) |
|
|
The 4 different sets of behaviour means this:
The BlockingDeque
interface extends the BlockingQueue
interface. That means that you can use aBlockingDeque
as a BlockingQueue
. If you do so, the various inserting methods will add the elements to the end of the deque, and the removing methods will remove the elements from the beginning of the deque. The inserting and removing methods of the BlockingQueue
interface, that is.
Here is a table of what the methods of the BlockingQueue
does in a BlockingDeque
implementation:
BlockingQueue | BlockingDeque |
add() | addLast() |
offer() x 2 | offerLast() x 2 |
put() | putLast() |
remove() | removeFirst() |
poll() x 2 | pollFirst() |
take() | takeFirst() |
element() | getFirst() |
peek() | peekFirst() |
Since BlockingDeque
is an interface, you need to use one of its many implementations to use it. Thejava.util.concurrent
package has the following implementations of the BlockingDeque
interface:
Here is a small code example of how to use the BlockingDeque
methods:
BlockingDeque<String> deque = new LinkedBlockingDeque<String>(); deque.addFirst("1"); deque.addLast("2"); String two = deque.takeLast(); String one = deque.takeFirst();