java concurrent 之 PriorityBlockingQueue
PriorityBlockingQueue
一個無界阻塞隊列,它使用與類 PriorityQueue 相同的順序規(guī)則,并且提供了阻塞獲取操作。雖然此隊列邏輯上是無界的,但是資源被耗盡時試圖執(zhí)行 add 操作也將失敗(導(dǎo)致 OutOfMemoryError)。此類不允許使用 null 元素。依賴自然順序的優(yōu)先級隊列也不允許插入不可比較的對象(這樣做會導(dǎo)致拋出 ClassCastException)。
此類及其迭代器可以實現(xiàn) Collection 和 Iterator 接口的所有可選 方法。iterator() 方法中提供的迭代器并不 保證以特定的順序遍歷 PriorityBlockingQueue 的元素。如果需要有序地進行遍歷,則應(yīng)考慮使用 Arrays.sort(pq.toArray())。此外,可以使用方法 drainTo 按優(yōu)先級順序移除 全部或部分元素,并將它們放在另一個 collection 中。
在此類上進行的操作不保證具有同等優(yōu)先級的元素的順序。如果需要實施某一排序,那么可以定義自定義類或者比較器,比較器可使用修改鍵斷開主優(yōu)先級值之間的聯(lián)系。例如,以下是應(yīng)用先進先出 (first-in-first-out) 規(guī)則斷開可比較元素之間聯(lián)系的一個類。要使用該類,則需要插入一個新的 FIFOEntry(anEntry) 來替換普通的條目對象。
還要注意的是,在情況下,你從一個PriorityBlockingQueue,獲得一個Iterator,該迭代器不保證迭代的優(yōu)先級順序的元素。
BlockingQueue queue = new PriorityBlockingQueue();
//String implements java.lang.Comparable
queue.put("Value");
String value = queue.take();