An unbounded {@linkplain BlockingQueue blocking queue} that uses
the same ordering rules as class
and supplies
blocking retrieval operations. While this queue is logically
unbounded, attempted additions may fail due to resource exhaustion
(causing
). This class does not permit
elements. A priority queue relying on {@linkplain
Comparable natural ordering} also does not permit insertion of
non-comparable objects (doing so results in
Operations on this class make no guarantees about the ordering
of elements with equal priority. If you need to enforce an
ordering, you can define custom classes or comparators that use a
secondary key to break ties in primary priority values. For
example, here is a class that applies first-in-first-out
tie-breaking to comparable elements. To use it, you would insert a
new FIFOEntry(anEntry) instead of a plain entry object.
| Constructor: |
public PriorityBlockingQueue() {
q = new PriorityQueue< E >();
}
Creates a PriorityBlockingQueue with the default
initial capacity (11) that orders its elements according to
their {@linkplain Comparable natural ordering}. |
public PriorityBlockingQueue(int initialCapacity) {
q = new PriorityQueue< E >(initialCapacity, null);
}
Creates a PriorityBlockingQueue with the specified
initial capacity that orders its elements according to their
{@linkplain Comparable natural ordering}. Parameters:
initialCapacity - the initial capacity for this priority queue
Throws:
IllegalArgumentException - if initialCapacity is less
than 1
|
public PriorityBlockingQueue(Collection c) {
q = new PriorityQueue< E >(c);
}
Creates a PriorityBlockingQueue containing the elements
in the specified collection. If the specified collection is a
SortedSet or a PriorityQueue , this
priority queue will be ordered according to the same ordering.
Otherwise, this priority queue will be ordered according to the
{@linkplain Comparable natural ordering} of its elements. Parameters:
c - the collection whose elements are to be placed
into this priority queue
Throws:
ClassCastException - if elements of the specified collection
cannot be compared to one another according to the priority
queue's ordering
NullPointerException - if the specified collection or any
of its elements are null
|
public PriorityBlockingQueue(int initialCapacity,
Comparator comparator) {
q = new PriorityQueue< E >(initialCapacity, comparator);
}
Creates a PriorityBlockingQueue with the specified initial
capacity that orders its elements according to the specified
comparator. Parameters:
initialCapacity - the initial capacity for this priority queue
comparator - the comparator that will be used to order this
priority queue. If {@code null}, the {@linkplain Comparable
natural ordering} of the elements will be used.
Throws:
IllegalArgumentException - if initialCapacity is less
than 1
|
| Method from java.util.concurrent.PriorityBlockingQueue Detail: |
public boolean add(E e) {
return offer(e);
}
Inserts the specified element into this priority queue. |
public void clear() {
final ReentrantLock lock = this.lock;
lock.lock();
try {
q.clear();
} finally {
lock.unlock();
}
}
Atomically removes all of the elements from this queue.
The queue will be empty after this call returns. |
public Comparator comparator() {
return q.comparator();
}
Returns the comparator used to order the elements in this queue,
or null if this queue uses the {@linkplain Comparable
natural ordering} of its elements. |
public boolean contains(Object o) {
final ReentrantLock lock = this.lock;
lock.lock();
try {
return q.contains(o);
} finally {
lock.unlock();
}
}
Returns {@code true} if this queue contains the specified element.
More formally, returns {@code true} if and only if this queue contains
at least one element {@code e} such that {@code o.equals(e)}. |
public int drainTo(Collection c) {
if (c == null)
throw new NullPointerException();
if (c == this)
throw new IllegalArgumentException();
final ReentrantLock lock = this.lock;
lock.lock();
try {
int n = 0;
E e;
while ( (e = q.poll()) != null) {
c.add(e);
++n;
}
return n;
} finally {
lock.unlock();
}
}
|
public int drainTo(Collection c,
int maxElements) {
if (c == null)
throw new NullPointerException();
if (c == this)
throw new IllegalArgumentException();
if (maxElements < = 0)
return 0;
final ReentrantLock lock = this.lock;
lock.lock();
try {
int n = 0;
E e;
while (n < maxElements && (e = q.poll()) != null) {
c.add(e);
++n;
}
return n;
} finally {
lock.unlock();
}
}
|
public Iterator iterator() {
return new Itr(toArray());
}
Returns an iterator over the elements in this queue. The
iterator does not return the elements in any particular order.
The returned Iterator is a "weakly consistent"
iterator that will never throw ConcurrentModificationException , and guarantees to traverse
elements as they existed upon construction of the iterator, and
may (but is not guaranteed to) reflect any modifications
subsequent to construction. |
public boolean offer(E e) {
final ReentrantLock lock = this.lock;
lock.lock();
try {
boolean ok = q.offer(e);
assert ok;
notEmpty.signal();
return true;
} finally {
lock.unlock();
}
}
Inserts the specified element into this priority queue. |
public boolean offer(E e,
long timeout,
TimeUnit unit) {
return offer(e); // never need to block
}
Inserts the specified element into this priority queue. As the queue is
unbounded this method will never block. |
public E peek() {
final ReentrantLock lock = this.lock;
lock.lock();
try {
return q.peek();
} finally {
lock.unlock();
}
}
|
public E poll() {
final ReentrantLock lock = this.lock;
lock.lock();
try {
return q.poll();
} finally {
lock.unlock();
}
}
|
public E poll(long timeout,
TimeUnit unit) throws InterruptedException {
long nanos = unit.toNanos(timeout);
final ReentrantLock lock = this.lock;
lock.lockInterruptibly();
try {
for (;;) {
E x = q.poll();
if (x != null)
return x;
if (nanos < = 0)
return null;
try {
nanos = notEmpty.awaitNanos(nanos);
} catch (InterruptedException ie) {
notEmpty.signal(); // propagate to non-interrupted thread
throw ie;
}
}
} finally {
lock.unlock();
}
}
|
public void put(E e) {
offer(e); // never need to block
}
Inserts the specified element into this priority queue. As the queue is
unbounded this method will never block. |
public int remainingCapacity() {
return Integer.MAX_VALUE;
}
Always returns Integer.MAX_VALUE because
a PriorityBlockingQueue is not capacity constrained. |
public boolean remove(Object o) {
final ReentrantLock lock = this.lock;
lock.lock();
try {
return q.remove(o);
} finally {
lock.unlock();
}
}
Removes a single instance of the specified element from this queue,
if it is present. More formally, removes an element {@code e} such
that {@code o.equals(e)}, if this queue contains one or more such
elements. Returns {@code true} if and only if this queue contained
the specified element (or equivalently, if this queue changed as a
result of the call). |
public int size() {
final ReentrantLock lock = this.lock;
lock.lock();
try {
return q.size();
} finally {
lock.unlock();
}
}
|
public E take() throws InterruptedException {
final ReentrantLock lock = this.lock;
lock.lockInterruptibly();
try {
try {
while (q.size() == 0)
notEmpty.await();
} catch (InterruptedException ie) {
notEmpty.signal(); // propagate to non-interrupted thread
throw ie;
}
E x = q.poll();
assert x != null;
return x;
} finally {
lock.unlock();
}
}
|
public Object[] toArray() {
final ReentrantLock lock = this.lock;
lock.lock();
try {
return q.toArray();
} finally {
lock.unlock();
}
}
Returns an array containing all of the elements in this queue.
The returned array elements are in no particular order.
The returned array will be "safe" in that no references to it are
maintained by this queue. (In other words, this method must allocate
a new array). The caller is thus free to modify the returned array.
This method acts as bridge between array-based and collection-based
APIs. |
public T[] toArray(T[] a) {
final ReentrantLock lock = this.lock;
lock.lock();
try {
return q.toArray(a);
} finally {
lock.unlock();
}
}
Returns an array containing all of the elements in this queue; the
runtime type of the returned array is that of the specified array.
The returned array elements are in no particular order.
If the queue fits in the specified array, it is returned therein.
Otherwise, a new array is allocated with the runtime type of the
specified array and the size of this queue.
If this queue fits in the specified array with room to spare
(i.e., the array has more elements than this queue), the element in
the array immediately following the end of the queue is set to
null.
Like the #toArray() method, this method acts as bridge between
array-based and collection-based APIs. Further, this method allows
precise control over the runtime type of the output array, and may,
under certain circumstances, be used to save allocation costs.
Suppose x is a queue known to contain only strings.
The following code can be used to dump the queue into a newly
allocated array of String:
String[] y = x.toArray(new String[0]);
Note that toArray(new Object[0]) is identical in function to
toArray(). |
public String toString() {
final ReentrantLock lock = this.lock;
lock.lock();
try {
return q.toString();
} finally {
lock.unlock();
}
}
|