PriorityBlockingQueue
PriorityBlockingQueue:一個(gè)無(wú)界的阻塞隊(duì)列,它使用與類PriorityQueue
相同的順序規(guī)則,并且提供了阻塞檢索的操作。雖然此隊(duì)列邏輯上是無(wú)界的,但是由于資源被耗盡,所以試圖執(zhí)行添加操作可能會(huì)失敗(導(dǎo)致
OutOfMemoryError)。此類不允許使用 null
元素。依賴自然順序的優(yōu)先級(jí)隊(duì)列也不允許插入不可比較的對(duì)象(因?yàn)檫@樣做會(huì)拋出 ClassCastException)。
用默認(rèn)的初始容量 (11) 創(chuàng)建一個(gè)
PriorityBlockingQueue,并根據(jù)元素的自然順序排序其元素(使用
Comparable)。
PriorityBlockingQueue(Collection<? extends E> c)
創(chuàng)建一個(gè)包含指定集合中元素的 PriorityBlockingQueue。
PriorityBlockingQueue(int initialCapacity)
使用指定的初始容量創(chuàng)建一個(gè) PriorityBlockingQueue,并根據(jù)元素的自然順序排序其元素(使用 Comparable)。
PriorityBlockingQueue(int initialCapacity,
Comparator<? super E> comparator)
使用指定的初始容量創(chuàng)建一個(gè) PriorityBlockingQueue,并根據(jù)指定的比較器排序其元素。
此類每次offer元素,都會(huì)有一個(gè)fixup操作,也就是排序,如果沒(méi)有構(gòu)造的時(shí)候傳入自己實(shí)現(xiàn)的比較器,就采用自然排序,否則采用比較器規(guī)則,進(jìn)行二分查找,比較,保持列頭是比較器希望的那個(gè)最大或則最小元素。
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;
}
}
}
posted on 2010-11-01 16:33 羔羊 閱讀(885) 評(píng)論(0) 編輯 收藏