/* * Written by Doug Lea with assistance from members of JCP JSR-166 * Expert Group and released to the public domain, as explained at * http://creativecommons.org/publicdomain/zero/1.0/ */ package jsr166x; // XXX This belongs in java.util!!! XXX import java.util.concurrent.*; // XXX This import goes away XXX import java.util.*; /** * A {@link Deque} that additionally supports operations that wait for * the deque to become non-empty when retrieving an element, and wait * for space to become available in the deque when storing an * element. These methods are summarized in the following table:

* * * * * * * * * * * * * * * * * * * * * * * * * * * * *
First Element (Head) Last Element (Tail)
BlockTime outBlockTime out
Insert{@link #putFirst putFirst(e)}{@link #offerFirst(Object, long, TimeUnit) offerFirst(e, time, unit)}{@link #putLast putLast(e)}{@link #offerLast(Object, long, TimeUnit) offerLast(e, time, unit)}
Remove{@link #takeFirst takeFirst()}{@link #pollFirst(long, TimeUnit) pollFirst(time, unit)}{@link #takeLast takeLast()}{@link #pollLast(long, TimeUnit) pollLast(time, unit)}
* *

Like any {@link BlockingQueue}, a BlockingDeque is * thread safe and may (or may not) be capacity-constrained. A * BlockingDeque implementation may be used directly as a * FIFO BlockingQueue. The blocking methods inherited from * the BlockingQueue interface are precisely equivalent to * BlockingDeque methods as indicated in the following table:

* * * * * * * * * * * * * * * * * * * * * * * *
BlockingQueue Method Equivalent BlockingDeque Method
{@link java.util.concurrent.BlockingQueue#put put(e)}{@link #putLast putLast(e)}
{@link java.util.concurrent.BlockingQueue#take take()}{@link #takeFirst takeFirst()}
{@link java.util.concurrent.BlockingQueue#offer(Object, long, TimeUnit) offer(e, time. unit)}{@link #offerLast(Object, long, TimeUnit) offerLast(e, time, unit)}
{@link java.util.concurrent.BlockingQueue#poll(long, TimeUnit) poll(time, unit)}{@link #pollFirst(long, TimeUnit) pollFirst(time, unit)}
* * *

This interface is a member of the * * Java Collections Framework. * * @since 1.6 * @author Doug Lea * @param the type of elements held in this collection */ public interface BlockingDeque extends Deque, BlockingQueue { /** * Adds the specified element as the first element of this deque, * waiting if necessary for space to become available. * @param o the element to add * @throws InterruptedException if interrupted while waiting * @throws NullPointerException if the specified element is null */ void putFirst(E o) throws InterruptedException; /** * Adds the specified element as the last element of this deque, * waiting if necessary for space to become available. * @param o the element to add * @throws InterruptedException if interrupted while waiting * @throws NullPointerException if the specified element is null */ void putLast(E o) throws InterruptedException; /** * Retrieves and removes the first element of this deque, waiting * if no elements are present on this deque. * @return the head of this deque * @throws InterruptedException if interrupted while waiting */ E takeFirst() throws InterruptedException; /** * Retrieves and removes the last element of this deque, waiting * if no elements are present on this deque. * @return the head of this deque * @throws InterruptedException if interrupted while waiting */ E takeLast() throws InterruptedException; /** * Inserts the specified element as the first element of this deque, * waiting if necessary up to the specified wait time for space to * become available. * @param o the element to add * @param timeout how long to wait before giving up, in units of * unit * @param unit a TimeUnit determining how to interpret the * timeout parameter * @return true if successful, or false if * the specified waiting time elapses before space is available * @throws InterruptedException if interrupted while waiting * @throws NullPointerException if the specified element is null */ boolean offerFirst(E o, long timeout, TimeUnit unit) throws InterruptedException; /** * Inserts the specified element as the last element of this deque, * waiting if necessary up to the specified wait time for space to * become available. * @param o the element to add * @param timeout how long to wait before giving up, in units of * unit * @param unit a TimeUnit determining how to interpret the * timeout parameter * @return true if successful, or false if * the specified waiting time elapses before space is available * @throws InterruptedException if interrupted while waiting * @throws NullPointerException if the specified element is null */ boolean offerLast(E o, long timeout, TimeUnit unit) throws InterruptedException; /** * Retrieves and removes the first element of this deque, waiting * if necessary up to the specified wait time if no elements are * present on this deque. * @param timeout how long to wait before giving up, in units of * unit * @param unit a TimeUnit determining how to interpret the * timeout parameter * @return the head of this deque, or null if the * specified waiting time elapses before an element is present * @throws InterruptedException if interrupted while waiting */ E pollFirst(long timeout, TimeUnit unit) throws InterruptedException; /** * Retrieves and removes the last element of this deque, waiting * if necessary up to the specified wait time if no elements are * present on this deque. * @param timeout how long to wait before giving up, in units of * unit * @param unit a TimeUnit determining how to interpret the * timeout parameter * @return the head of this deque, or null if the * specified waiting time elapses before an element is present * @throws InterruptedException if interrupted while waiting */ E pollLast(long timeout, TimeUnit unit) throws InterruptedException; /** * Adds the specified element as the last element of this deque, * waiting if necessary for space to become available. This * method is equivalent to putLast * @param o the element to add * @throws InterruptedException if interrupted while waiting * @throws NullPointerException if the specified element is null */ void put(E o) throws InterruptedException; /** * Inserts the specified element as the lest element of this * deque, if possible. When using deques that may impose * insertion restrictions (for example capacity bounds), method * offer is generally preferable to method {@link * Collection#add}, which can fail to insert an element only by * throwing an exception. This method is equivalent to * offerLast. * * @param o the element to add * @return true if it was possible to add the element to * this deque, else false * @throws NullPointerException if the specified element is null */ boolean offer(E o, long timeout, TimeUnit unit) throws InterruptedException; /** * Retrieves and removes the first element of this deque, waiting * if no elements are present on this deque. * This method is equivalent to takeFirst. * @return the head of this deque * @throws InterruptedException if interrupted while waiting */ E take() throws InterruptedException; /** * Retrieves and removes the first element of this deque, waiting * if necessary up to the specified wait time if no elements are * present on this deque. This method is equivalent to * pollFirst. * @param timeout how long to wait before giving up, in units of * unit * @param unit a TimeUnit determining how to interpret the * timeout parameter * @return the head of this deque, or null if the * specified waiting time elapses before an element is present * @throws InterruptedException if interrupted while waiting */ E poll(long timeout, TimeUnit unit) throws InterruptedException; }