BlockingDeque
Jakob Jenkov |
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.
BlockingDeque Usage
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.
BlockingDeque methods
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:
- Throws Exception:
If the attempted operation is not possible immediately, an exception is thrown. - Special Value:
If the attempted operation is not possible immediately, a special value is returned (often true / false). - Blocks:
If the attempted operation is not possible immedidately, the method call blocks until it is. - Times Out:
If the attempted operation is not possible immedidately, the method call blocks until it is, but waits no longer than the given timeout. Returns a special value telling whether the operation succeeded or not (typically true / false).
BlockingDeque Extends BlockingQueue
The BlockingDeque
interface extends the BlockingQueue
interface. That means that you can
use a BlockingDeque
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() |
BlockingDeque Implementations
Since BlockingDeque
is an interface, you need to use one of its many implementations to use it.
The java.util.concurrent
package has the following implementations of the BlockingDeque
interface:
BlockingDeque Code Example
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();
Tweet | |
Jakob Jenkov |