On 07/25/13 10:15, Doug Lea wrote:
On 07/24/13 19:30, Martin Buchholz wrote:
PriorityQueue is unusual in that Doug maintains a copy in jsr166 CVS even though
it is a non-thread-safe collection. I think it makes sense,
because PriorityQueue and PriorityBlockingQueue have parallel APIs and parallel
implementations. Many changes to one file require a matching change to the
other.
The history is that we introduced java.util.concurrent.PriorityBlockingQueue,
for JDK1.5 which of course led to people wanting plain java.util.PriorityQueue,
which Josh started working on while at Sun. But for sake of JCP approval,
we pulled into jsr166 and have adopted ever since, because the two
classes share code. The capacity constructor was added in JDK1.6,
but I have no recollection why there is not one with comparator
but no capacity. It seems reasonable to add one.
Now I remember. Or rather javac forces me to remember.
Adding this constructor breaks source compatibility:
[javac] /home/dl/concurrent/src/test/tck/PriorityBlockingQueueTest.java:97:
error: reference to PriorityBlockingQueue is ambiguous
[javac] new PriorityBlockingQueue(null);
[javac] ^
[javac] both constructor PriorityBlockingQueue(Comparator<? super E>) in
PriorityBlockingQueue and constructor PriorityBlockingQueue(Collection<? extends
E>) in PriorityBlockingQueue match
[javac] where E is a type-variable:
[javac] E extends Object declared in class PriorityBlockingQueue
I'm thinking to not include this at least in PriorityBlockingQueue.
-Doug
Regarding this particular change, if PriorityQueue gets a new constructor taking
a Comparator, then PriorityBlockingQueue probably should too
Yes.
*** PriorityBlockingQueue.java.~1.99.~ Wed Jul 24 11:23:05 2013
--- PriorityBlockingQueue.java Thu Jul 25 10:13:47 2013
***************
*** 200,205 ****
--- 200,219 ----
}
/**
+ * Creates a {@code PriorityBlockingQueue} with the default
+ * initial capacity that orders its elements according to the
+ * specified comparator.
+ *
+ * @param 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.
+ * @since 1.8
+ */
+ public PriorityBlockingQueue(Comparator<? super E> comparator) {
+ this(DEFAULT_INITIAL_CAPACITY, comparator);
+ }
+
+ /**
* Creates a {@code PriorityBlockingQueue} containing the elements
* in the specified collection. If the specified collection is a
* {@link SortedSet} or a {@link PriorityQueue}, this