PriorityBlockingQueue
PriorityBlockingQueue:一個無界的阻塞隊列,它使用與類PriorityQueue
相同的順序規則,并且提供了阻塞檢索的操作。雖然此隊列邏輯上是無界的,但是由于資源被耗盡,所以試圖執行添加操作可能會失敗(導致
OutOfMemoryError)。此類不允許使用 null
元素。依賴自然順序的優先級隊列也不允許插入不可比較的對象(因為這樣做會拋出 ClassCastException)。
用默認的初始容量 (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;
}
}
}