/* * Written by Doug Lea with assistance from members of JCP JSR-166 * Expert Group and released to the public domain. Use, modify, and * redistribute this code in any way without acknowledgement. */ package java.util.concurrent; import java.util.Queue; /** * A BlockingQueue is a {@link java.util.Queue} that * additionally supports operations that wait for elements to exist * when taking them, and wait for space to exist when putting them. * *

BlockingQueues do not accept null elements. * Implementations throw IllegalArgumentException on attempts * to add, put or offer a null. A * null is used as a sentinel value to indicate failure of * poll operations. * *

BlockingQueues may be capacity bounded. At any given * time they may have a remainingCapacity beyond which no * additional elements can be put without blocking. * BlockingQueues without any intrinsic capacity constraints always * report Integer.MAX_VALUE remaining capacity. * *

While BlockingQueues are designed to be used primarily * as producer-consumer queues, they support the Collection * interface. So for example, it is possible to remove an arbitrary * element from within a queue using remove(x). However, * such operations are in general NOT performed very * efficiently, and are intended for only occasional use; for example, * when a queued message is cancelled. Also, the bulk operations, most * notably addAll are NOT performed atomically, so * it is possible for addAll(c) to fail (throwing an * exception) after adding only some of the elements in c. * *

BlockingQueues do not intrinsically support * any kind of "close" or "shutdown" operation to * indicate that no more items will be added. The needs and usage of * such features tend to be implementation dependent. For example, a * common tactic is for producers to insert special * end-of-stream or poison objects, that are * interpreted accordingly when taken by consumers. * *

* Usage example. Here is a sketch of a classic producer-consumer program. *

 * class Producer implements Runnable {
 *   private final BlockingQueue queue;
 *   Producer(BlockingQueue q) { queue = q; }
 *   public void run() {
 *     try {
 *       while(true) { queue.put(produce()); }
 *     }
 *     catch (InterruptedException ex) { ... handle ...}
 *   }
 *   Object produce() { ... }
 * }
 *
 *
 * class Consumer implements Runnable {
 *   private final BlockingQueue queue;
 *   Concumer(BlockingQueue q) { queue = q; }
 *   public void run() {
 *     try {
 *       while(true) { consume(queue.take()); }
 *     }
 *     catch (InterruptedException ex) { ... handle ...}
 *   }
 *   void consume(Object x) { ... }
 * }
 *
 * class Setup {
 *   void main() {
 *     BlockingQueue q = new SomeQueueImplementation();
 *     Producer p = new Producer(q);
 *     Consumer c = new Consumer(q);
 *     new Thread(p).start();
 *     new Thread(c).start();
 *   }
 * }
 * 
* * * @since 1.5 * @spec JSR-166 * @revised $Date: 2003/05/28 23:00:40 $ * @editor $Author: dl $ */ public interface BlockingQueue extends Queue { /** * Take an object from the queue, waiting if necessary for * an object to be present. * @return the object * @throws InterruptedException if interrupted while waiting. */ public E take() throws InterruptedException; /** * Take an object from the queue if one is available within given wait * time * @param timeout the maximum time to wait * @param unit the time unit of the timeout argument. * @return the object, or null if the specified * waiting time elapses before an object is present. * @throws InterruptedException if interrupted while waiting. */ public E poll(long timeout, TimeUnit unit) throws InterruptedException; /** * Add the given object to the queue, waiting if necessary for * space to become available. * @param x the object to add * @throws InterruptedException if interrupted while waiting. */ public void put(E x) throws InterruptedException; /** * Add the given object to the queue if space is available within * given wait time. * @param x the object to add * @param timeout the maximum time to wait * @param unit the time unit of the timeout argument. * @return true if successful, or false if * the specified waiting time elapses before space is available. * @throws InterruptedException if interrupted while waiting. */ public boolean offer(E x, long timeout, TimeUnit unit) throws InterruptedException; /** * Return the number of elements that this queue can ideally (in * the absence of memory or resource constraints) accept without * blocking, or Integer.MAX_VALUE if there is no * intrinsic limit. Note that you cannot always tell if * an attempt to add an element will succeed by * inspecting remainingCapacity because it may be the * case that a waiting consumer is ready to take an * element out of an otherwise full queue. * @return the remaining capacity **/ public int remainingCapacity(); }