ArrayBlockingQueue.java revision bba8d1acd6dfff06c94d761c67a30154ca5ca5df
1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Written by Doug Lea with assistance from members of JCP JSR-166 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Expert Group and released to the public domain, as explained at 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://creativecommons.org/licenses/publicdomain 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.util.concurrent; 8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.concurrent.locks.*; 9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.*; 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// BEGIN android-note 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// removed link to collections framework docs 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// END android-note 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * A bounded {@linkplain BlockingQueue blocking queue} backed by an 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * array. This queue orders elements FIFO (first-in-first-out). The 18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <em>head</em> of the queue is that element that has been on the 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * queue the longest time. The <em>tail</em> of the queue is that 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * element that has been on the queue the shortest time. New elements 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * are inserted at the tail of the queue, and the queue retrieval 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * operations obtain elements at the head of the queue. 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>This is a classic "bounded buffer", in which a 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * fixed-sized array holds elements inserted by producers and 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * extracted by consumers. Once created, the capacity cannot be 27bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * increased. Attempts to <tt>put</tt> an element into a full queue 28bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * will result in the operation blocking; attempts to <tt>take</tt> an 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * element from an empty queue will similarly block. 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> This class supports an optional fairness policy for ordering 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * waiting producer and consumer threads. By default, this ordering 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * is not guaranteed. However, a queue constructed with fairness set 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * to <tt>true</tt> grants threads access in FIFO order. Fairness 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * generally decreases throughput but reduces variability and avoids 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * starvation. 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 38bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * <p>This class and its iterator implement all of the 39bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * <em>optional</em> methods of the {@link Collection} and {@link 40bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * Iterator} interfaces. 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since 1.5 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @author Doug Lea 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param <E> the type of elements held in this collection 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class ArrayBlockingQueue<E> extends AbstractQueue<E> 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project implements BlockingQueue<E>, java.io.Serializable { 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Serialization ID. This class relies on default serialization 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * even for the items array, which is default-serialized, even if 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * it is empty. Otherwise it could not be declared final, which is 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * necessary here. 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final long serialVersionUID = -817911632652898426L; 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** The queued items */ 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final E[] items; 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** items index for next take, poll or remove */ 60bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson private int takeIndex; 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** items index for next put, offer, or add. */ 62bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson private int putIndex; 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** Number of items in the queue */ 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private int count; 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Concurrency control uses the classic two-condition algorithm 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * found in any textbook. 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** Main lock guarding all access */ 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final ReentrantLock lock; 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** Condition for waiting takes */ 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final Condition notEmpty; 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** Condition for waiting puts */ 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final Condition notFull; 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Internal helper methods 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Circularly increment i. 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final int inc(int i) { 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return (++i == items.length)? 0 : i; 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 88bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * Inserts element at current put position, advances, and signals. 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Call only when holding lock. 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private void insert(E x) { 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project items[putIndex] = x; 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project putIndex = inc(putIndex); 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ++count; 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project notEmpty.signal(); 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 99bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * Extracts element at current take position, advances, and signals. 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Call only when holding lock. 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private E extract() { 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final E[] items = this.items; 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project E x = items[takeIndex]; 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project items[takeIndex] = null; 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project takeIndex = inc(takeIndex); 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project --count; 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project notFull.signal(); 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return x; 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Utility for remove and iterator.remove: Delete item at position i. 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Call only when holding lock. 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project void removeAt(int i) { 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final E[] items = this.items; 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // if removing front item, just advance 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (i == takeIndex) { 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project items[takeIndex] = null; 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project takeIndex = inc(takeIndex); 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // slide over all others up through putIndex. 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (;;) { 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int nexti = inc(i); 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (nexti != putIndex) { 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project items[i] = items[nexti]; 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project i = nexti; 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project items[i] = null; 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project putIndex = i; 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project break; 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project --count; 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project notFull.signal(); 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates an <tt>ArrayBlockingQueue</tt> with the given (fixed) 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * capacity and default access policy. 143bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param capacity the capacity of this queue 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException if <tt>capacity</tt> is less than 1 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public ArrayBlockingQueue(int capacity) { 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this(capacity, false); 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates an <tt>ArrayBlockingQueue</tt> with the given (fixed) 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * capacity and the specified access policy. 154bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param capacity the capacity of this queue 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param fair if <tt>true</tt> then queue accesses for threads blocked 157bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * on insertion or removal, are processed in FIFO order; 158bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * if <tt>false</tt> the access order is unspecified. 159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException if <tt>capacity</tt> is less than 1 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public ArrayBlockingQueue(int capacity, boolean fair) { 162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (capacity <= 0) 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IllegalArgumentException(); 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.items = (E[]) new Object[capacity]; 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lock = new ReentrantLock(fair); 166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project notEmpty = lock.newCondition(); 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project notFull = lock.newCondition(); 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates an <tt>ArrayBlockingQueue</tt> with the given (fixed) 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * capacity, the specified access policy and initially containing the 173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * elements of the given collection, 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * added in traversal order of the collection's iterator. 175bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param capacity the capacity of this queue 177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param fair if <tt>true</tt> then queue accesses for threads blocked 178bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * on insertion or removal, are processed in FIFO order; 179bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * if <tt>false</tt> the access order is unspecified. 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param c the collection of elements to initially contain 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException if <tt>capacity</tt> is less than 182bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * <tt>c.size()</tt>, or less than 1. 183bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * @throws NullPointerException if the specified collection or any 184bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * of its elements are null 185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public ArrayBlockingQueue(int capacity, boolean fair, 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Collection<? extends E> c) { 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this(capacity, fair); 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (capacity < c.size()) 190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IllegalArgumentException(); 191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (Iterator<? extends E> it = c.iterator(); it.hasNext();) 193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project add(it.next()); 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 197bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * Inserts the specified element at the tail of this queue if it is 198bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * possible to do so immediately without exceeding the queue's capacity, 199bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * returning <tt>true</tt> upon success and throwing an 200bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * <tt>IllegalStateException</tt> if this queue is full. 201bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * 202bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * @param e the element to add 203bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * @return <tt>true</tt> (as specified by {@link Collection#add}) 204bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * @throws IllegalStateException if this queue is full 205bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * @throws NullPointerException if the specified element is null 206bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson */ 207bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson public boolean add(E e) { 208bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson return super.add(e); 209bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson } 210bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson 211bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson /** 212bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * Inserts the specified element at the tail of this queue if it is 213bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * possible to do so immediately without exceeding the queue's capacity, 214bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * returning <tt>true</tt> upon success and <tt>false</tt> if this queue 215bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * is full. This method is generally preferable to method {@link #add}, 216bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * which can fail to insert an element only by throwing an exception. 217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 218bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * @throws NullPointerException if the specified element is null 219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 220bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson public boolean offer(E e) { 221bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson if (e == null) throw new NullPointerException(); 222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final ReentrantLock lock = this.lock; 223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lock.lock(); 224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (count == items.length) 226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return false; 227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project else { 228bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson insert(e); 229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } finally { 232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lock.unlock(); 233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 237bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * Inserts the specified element at the tail of this queue, waiting 238bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * for space to become available if the queue is full. 239bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * 240bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * @throws InterruptedException {@inheritDoc} 241bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * @throws NullPointerException {@inheritDoc} 242bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson */ 243bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson public void put(E e) throws InterruptedException { 244bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson if (e == null) throw new NullPointerException(); 245bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson final E[] items = this.items; 246bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson final ReentrantLock lock = this.lock; 247bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson lock.lockInterruptibly(); 248bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson try { 249bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson try { 250bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson while (count == items.length) 251bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson notFull.await(); 252bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson } catch (InterruptedException ie) { 253bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson notFull.signal(); // propagate to non-interrupted thread 254bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson throw ie; 255bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson } 256bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson insert(e); 257bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson } finally { 258bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson lock.unlock(); 259bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson } 260bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson } 261bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson 262bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson /** 263bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * Inserts the specified element at the tail of this queue, waiting 264bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * up to the specified wait time for space to become available if 265bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * the queue is full. 266bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * 267bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * @throws InterruptedException {@inheritDoc} 268bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * @throws NullPointerException {@inheritDoc} 269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 270bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson public boolean offer(E e, long timeout, TimeUnit unit) 271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws InterruptedException { 272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 273bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson if (e == null) throw new NullPointerException(); 274bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson long nanos = unit.toNanos(timeout); 275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final ReentrantLock lock = this.lock; 276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lock.lockInterruptibly(); 277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (;;) { 279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (count != items.length) { 280bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson insert(e); 281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (nanos <= 0) 284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return false; 285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project nanos = notFull.awaitNanos(nanos); 287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (InterruptedException ie) { 288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project notFull.signal(); // propagate to non-interrupted thread 289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw ie; 290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } finally { 293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lock.unlock(); 294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public E poll() { 298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final ReentrantLock lock = this.lock; 299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lock.lock(); 300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (count == 0) 302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return null; 303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project E x = extract(); 304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return x; 305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } finally { 306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lock.unlock(); 307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 310bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson public E take() throws InterruptedException { 311bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson final ReentrantLock lock = this.lock; 312bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson lock.lockInterruptibly(); 313bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson try { 314bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson try { 315bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson while (count == 0) 316bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson notEmpty.await(); 317bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson } catch (InterruptedException ie) { 318bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson notEmpty.signal(); // propagate to non-interrupted thread 319bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson throw ie; 320bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson } 321bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson E x = extract(); 322bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson return x; 323bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson } finally { 324bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson lock.unlock(); 325bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson } 326bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson } 327bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson 328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public E poll(long timeout, TimeUnit unit) throws InterruptedException { 329bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson long nanos = unit.toNanos(timeout); 330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final ReentrantLock lock = this.lock; 331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lock.lockInterruptibly(); 332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (;;) { 334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (count != 0) { 335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project E x = extract(); 336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return x; 337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (nanos <= 0) 339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return null; 340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project nanos = notEmpty.awaitNanos(nanos); 342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (InterruptedException ie) { 343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project notEmpty.signal(); // propagate to non-interrupted thread 344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw ie; 345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } finally { 349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lock.unlock(); 350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public E peek() { 354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final ReentrantLock lock = this.lock; 355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lock.lock(); 356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return (count == 0) ? null : items[takeIndex]; 358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } finally { 359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lock.unlock(); 360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // this doc comment is overridden to remove the reference to collections 364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // greater in size than Integer.MAX_VALUE 365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the number of elements in this queue. 367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 368bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * @return the number of elements in this queue 369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int size() { 371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final ReentrantLock lock = this.lock; 372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lock.lock(); 373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return count; 375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } finally { 376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lock.unlock(); 377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // this doc comment is a modified copy of the inherited doc comment, 381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // without the reference to unlimited queues. 382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 383bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * Returns the number of additional elements that this queue can ideally 384bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * (in the absence of memory or resource constraints) accept without 385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * blocking. This is always equal to the initial capacity of this queue 386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * less the current <tt>size</tt> of this queue. 387bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * 388bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * <p>Note that you <em>cannot</em> always tell if an attempt to insert 389bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * an element will succeed by inspecting <tt>remainingCapacity</tt> 390bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * because it may be the case that another thread is about to 391bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * insert or remove an element. 392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int remainingCapacity() { 394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final ReentrantLock lock = this.lock; 395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lock.lock(); 396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return items.length - count; 398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } finally { 399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lock.unlock(); 400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 403bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson /** 404bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * Removes a single instance of the specified element from this queue, 405bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * if it is present. More formally, removes an element <tt>e</tt> such 406bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * that <tt>o.equals(e)</tt>, if this queue contains one or more such 407bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * elements. 408bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * Returns <tt>true</tt> if this queue contained the specified element 409bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * (or equivalently, if this queue changed as a result of the call). 410bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * 411bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * @param o element to be removed from this queue, if present 412bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * @return <tt>true</tt> if this queue changed as a result of the call 413bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson */ 414bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson public boolean remove(Object o) { 415bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson if (o == null) return false; 416bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson final E[] items = this.items; 417bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson final ReentrantLock lock = this.lock; 418bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson lock.lock(); 419bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson try { 420bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson int i = takeIndex; 421bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson int k = 0; 422bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson for (;;) { 423bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson if (k++ >= count) 424bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson return false; 425bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson if (o.equals(items[i])) { 426bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson removeAt(i); 427bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson return true; 428bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson } 429bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson i = inc(i); 430bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson } 431bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson 432bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson } finally { 433bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson lock.unlock(); 434bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson } 435bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson } 436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 437bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson /** 438bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * Returns <tt>true</tt> if this queue contains the specified element. 439bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * More formally, returns <tt>true</tt> if and only if this queue contains 440bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * at least one element <tt>e</tt> such that <tt>o.equals(e)</tt>. 441bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * 442bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * @param o object to be checked for containment in this queue 443bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * @return <tt>true</tt> if this queue contains the specified element 444bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson */ 445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean contains(Object o) { 446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (o == null) return false; 447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final E[] items = this.items; 448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final ReentrantLock lock = this.lock; 449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lock.lock(); 450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int i = takeIndex; 452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int k = 0; 453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (k++ < count) { 454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (o.equals(items[i])) 455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project i = inc(i); 457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return false; 459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } finally { 460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lock.unlock(); 461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 464bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson /** 465bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * Returns an array containing all of the elements in this queue, in 466bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * proper sequence. 467bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * 468bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * <p>The returned array will be "safe" in that no references to it are 469bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * maintained by this queue. (In other words, this method must allocate 470bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * a new array). The caller is thus free to modify the returned array. 471bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * 472bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * <p>This method acts as bridge between array-based and collection-based 473bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * APIs. 474bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * 475bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * @return an array containing all of the elements in this queue 476bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson */ 477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Object[] toArray() { 478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final E[] items = this.items; 479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final ReentrantLock lock = this.lock; 480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lock.lock(); 481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Object[] a = new Object[count]; 483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int k = 0; 484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int i = takeIndex; 485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (k < count) { 486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project a[k++] = items[i]; 487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project i = inc(i); 488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return a; 490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } finally { 491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lock.unlock(); 492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 495bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson /** 496bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * Returns an array containing all of the elements in this queue, in 497bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * proper sequence; the runtime type of the returned array is that of 498bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * the specified array. If the queue fits in the specified array, it 499bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * is returned therein. Otherwise, a new array is allocated with the 500bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * runtime type of the specified array and the size of this queue. 501bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * 502bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * <p>If this queue fits in the specified array with room to spare 503bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * (i.e., the array has more elements than this queue), the element in 504bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * the array immediately following the end of the queue is set to 505bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * <tt>null</tt>. 506bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * 507bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * <p>Like the {@link #toArray()} method, this method acts as bridge between 508bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * array-based and collection-based APIs. Further, this method allows 509bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * precise control over the runtime type of the output array, and may, 510bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * under certain circumstances, be used to save allocation costs. 511bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * 512bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * <p>Suppose <tt>x</tt> is a queue known to contain only strings. 513bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * The following code can be used to dump the queue into a newly 514bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * allocated array of <tt>String</tt>: 515bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * 516bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * <pre> 517bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * String[] y = x.toArray(new String[0]);</pre> 518bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * 519bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * Note that <tt>toArray(new Object[0])</tt> is identical in function to 520bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * <tt>toArray()</tt>. 521bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * 522bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * @param a the array into which the elements of the queue are to 523bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * be stored, if it is big enough; otherwise, a new array of the 524bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * same runtime type is allocated for this purpose 525bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * @return an array containing all of the elements in this queue 526bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * @throws ArrayStoreException if the runtime type of the specified array 527bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * is not a supertype of the runtime type of every element in 528bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * this queue 529bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * @throws NullPointerException if the specified array is null 530bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson */ 531adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public <T> T[] toArray(T[] a) { 532adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final E[] items = this.items; 533adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final ReentrantLock lock = this.lock; 534adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lock.lock(); 535adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 536adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (a.length < count) 537adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project a = (T[])java.lang.reflect.Array.newInstance( 538adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project a.getClass().getComponentType(), 539adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project count 540adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ); 541adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 542adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int k = 0; 543adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int i = takeIndex; 544adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (k < count) { 545adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project a[k++] = (T)items[i]; 546adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project i = inc(i); 547adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 548adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (a.length > count) 549adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project a[count] = null; 550adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return a; 551adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } finally { 552adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lock.unlock(); 553adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 554adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 555adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 556adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String toString() { 557adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final ReentrantLock lock = this.lock; 558adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lock.lock(); 559adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 560adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return super.toString(); 561adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } finally { 562adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lock.unlock(); 563adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 564adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 565adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 566bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson /** 567bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * Atomically removes all of the elements from this queue. 568bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * The queue will be empty after this call returns. 569bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson */ 570adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void clear() { 571adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final E[] items = this.items; 572adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final ReentrantLock lock = this.lock; 573adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lock.lock(); 574adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 575adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int i = takeIndex; 576adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int k = count; 577adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (k-- > 0) { 578adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project items[i] = null; 579adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project i = inc(i); 580adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 581adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project count = 0; 582adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project putIndex = 0; 583adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project takeIndex = 0; 584adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project notFull.signalAll(); 585adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } finally { 586adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lock.unlock(); 587adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 588adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 589adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 590bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson /** 591bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * @throws UnsupportedOperationException {@inheritDoc} 592bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * @throws ClassCastException {@inheritDoc} 593bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * @throws NullPointerException {@inheritDoc} 594bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * @throws IllegalArgumentException {@inheritDoc} 595bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson */ 596adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int drainTo(Collection<? super E> c) { 597adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (c == null) 598adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new NullPointerException(); 599adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (c == this) 600adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IllegalArgumentException(); 601adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final E[] items = this.items; 602adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final ReentrantLock lock = this.lock; 603adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lock.lock(); 604adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 605adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int i = takeIndex; 606adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int n = 0; 607adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int max = count; 608adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (n < max) { 609adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project c.add(items[i]); 610adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project items[i] = null; 611adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project i = inc(i); 612adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ++n; 613adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 614adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (n > 0) { 615adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project count = 0; 616adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project putIndex = 0; 617adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project takeIndex = 0; 618adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project notFull.signalAll(); 619adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 620adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return n; 621adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } finally { 622adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lock.unlock(); 623adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 624adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 625adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 626bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson /** 627bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * @throws UnsupportedOperationException {@inheritDoc} 628bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * @throws ClassCastException {@inheritDoc} 629bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * @throws NullPointerException {@inheritDoc} 630bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * @throws IllegalArgumentException {@inheritDoc} 631bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson */ 632adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int drainTo(Collection<? super E> c, int maxElements) { 633adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (c == null) 634adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new NullPointerException(); 635adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (c == this) 636adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IllegalArgumentException(); 637adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (maxElements <= 0) 638adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return 0; 639adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final E[] items = this.items; 640adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final ReentrantLock lock = this.lock; 641adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lock.lock(); 642adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 643adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int i = takeIndex; 644adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int n = 0; 645adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int sz = count; 646adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int max = (maxElements < count)? maxElements : count; 647adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (n < max) { 648adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project c.add(items[i]); 649adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project items[i] = null; 650adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project i = inc(i); 651adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ++n; 652adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 653adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (n > 0) { 654adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project count -= n; 655adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project takeIndex = i; 656adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project notFull.signalAll(); 657adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 658adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return n; 659adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } finally { 660adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lock.unlock(); 661adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 662adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 663adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 664adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 665adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 666adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns an iterator over the elements in this queue in proper sequence. 667adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The returned <tt>Iterator</tt> is a "weakly consistent" iterator that 668bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * will never throw {@link ConcurrentModificationException}, 669adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * and guarantees to traverse elements as they existed upon 670adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * construction of the iterator, and may (but is not guaranteed to) 671adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * reflect any modifications subsequent to construction. 672adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 673bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * @return an iterator over the elements in this queue in proper sequence 674adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 675adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Iterator<E> iterator() { 676adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final ReentrantLock lock = this.lock; 677adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lock.lock(); 678adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 679adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new Itr(); 680adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } finally { 681adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lock.unlock(); 682adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 683adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 684adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 685adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 686adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Iterator for ArrayBlockingQueue 687adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 688adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private class Itr implements Iterator<E> { 689adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 690adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Index of element to be returned by next, 691adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * or a negative number if no such. 692adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 693adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private int nextIndex; 694adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 695adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 696adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * nextItem holds on to item fields because once we claim 697adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * that an element exists in hasNext(), we must return it in 698adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the following next() call even if it was in the process of 699adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * being removed when hasNext() was called. 700bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson */ 701adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private E nextItem; 702adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 703adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 704adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Index of element returned by most recent call to next. 705adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reset to -1 if this element is deleted by a call to remove. 706adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 707adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private int lastRet; 708adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 709adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Itr() { 710adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lastRet = -1; 711adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (count == 0) 712adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project nextIndex = -1; 713adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project else { 714adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project nextIndex = takeIndex; 715adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project nextItem = items[takeIndex]; 716adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 717adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 718adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 719adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean hasNext() { 720adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 721adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * No sync. We can return true by mistake here 722adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * only if this iterator passed across threads, 723adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * which we don't support anyway. 724adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 725adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return nextIndex >= 0; 726adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 727adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 728adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 729bba8d1acd6dfff06c94d761c67a30154ca5ca5dfJesse Wilson * Checks whether nextIndex is valid; if so setting nextItem. 730adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Stops iterator when either hits putIndex or sees null item. 731adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 732adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private void checkNext() { 733adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (nextIndex == putIndex) { 734adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project nextIndex = -1; 735adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project nextItem = null; 736adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 737adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project nextItem = items[nextIndex]; 738adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (nextItem == null) 739adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project nextIndex = -1; 740adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 741adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 742adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 743adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public E next() { 744adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final ReentrantLock lock = ArrayBlockingQueue.this.lock; 745adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lock.lock(); 746adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 747adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (nextIndex < 0) 748adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new NoSuchElementException(); 749adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lastRet = nextIndex; 750adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project E x = nextItem; 751adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project nextIndex = inc(nextIndex); 752adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project checkNext(); 753adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return x; 754adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } finally { 755adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lock.unlock(); 756adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 757adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 758adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 759adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void remove() { 760adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final ReentrantLock lock = ArrayBlockingQueue.this.lock; 761adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lock.lock(); 762adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 763adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int i = lastRet; 764adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (i == -1) 765adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IllegalStateException(); 766adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lastRet = -1; 767adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 768adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int ti = takeIndex; 769adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project removeAt(i); 770adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // back up cursor (reset to front if was first element) 771adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project nextIndex = (i == ti) ? takeIndex : i; 772adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project checkNext(); 773adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } finally { 774adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lock.unlock(); 775adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 776adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 777adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 778adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 779