PriorityBlockingQueue:一个无界的
阻塞队列,它使用与类
PriorityQueue
相同的顺序规则,并且提供了阻塞检索的操作。虽然此队列逻辑上是无界的,但是由于资源被耗尽,所以试图执行添加操作可能会失败(导致
OutOfMemoryError)。此类不允许使用
null
元素。依赖自然顺序的优先级队列也不允许插入不可比较的对象(因为这样做会抛出
ClassCastException)。
PriorityBlockingQueue()
用默认的初始容量 (11) 创建一个
PriorityBlockingQueue,并根据元素的自然顺序排序其元素(使用
Comparable)。
PriorityBlockingQueue(Collection<? extends E> c)
创建一个包含指定集合中元素的
PriorityBlockingQueue。
PriorityBlockingQueue(int initialCapacity)
使用指定的初始容量创建一个
PriorityBlockingQueue,并根据元素的自然顺序排序其元素(使用
Comparable)。
PriorityBlockingQueue(int initialCapacity,
Comparator<? super E> comparator)
使用指定的初始容量创建一个
PriorityBlockingQueue,并根据指定的比较器排序其元素。
此类每次offer元素,都会有一个fixup操作,也就是排序,如果没有构造的时候传入自己实现的比较器,就采用自然排序,否则采用比较器规则,进行二分查找,比较,保持列头是比较器希望的那个最大或则最小元素。
private void fixUp(int k) {
if (comparator == null) {
while (k > 1) {
int j = k >> 1;
if (((Comparable<E>)queue[j]).compareTo((E)queue[k]) <= 0)
break;
Object tmp = queue[j]; queue[j] = queue[k]; queue[k] = tmp;
k = j;
}
} else {
while (k > 1) {
int j = k >>> 1;
if (comparator.compare((E)queue[j], (E)queue[k]) <= 0)
break;
Object tmp = queue[j]; queue[j] = queue[k]; queue[k] = tmp;
k = j;
}
}
}