學習Java: Queue
Queue: 基本上,一個佇列就是一個先入先出(FIFO)的資料結構
offer,add區別:
一些佇列有大小限制,因此如果想在一個滿的佇列中加入一個新項,多出的項就會被拒絕。
這時新的 offer 方法就可以起作用了。它不是對呼叫 add() 方法丟擲一個 unchecked 異常,而只是得到由 offer() 返回的 false。
poll,remove區別:
remove() 和 poll() 方法都是從佇列中刪除第一個元素(head)。remove() 的行為與 Collection 介面的版本相似,
但是新的 poll() 方法在用空集合呼叫時不是丟擲異常,只是返回 null。因此新的方法更適合容易出現異常條件的情況。
peek,element區別:
element() 和 peek() 用於在佇列的頭部查詢元素。與 remove() 方法類似,在佇列為空時, element() 丟擲一個異常,而 peek() 返回 null。
-----------------------------------------------------------------------------------------
Tiger中有2組Queue的實現:實現了新的BlockingQueue介面的
和沒有實現的
-------------------------------------------------------------
沒有實現的阻塞介面的:LinkedList: 實現了java.util.Queue介面
java.util.AbstractQueue
內建的不阻塞佇列: PriorityQueue 和 ConcurrentLinkedQueue
PriorityQueue 和 ConcurrentLinkedQueue 類在 Collection Framework 中加入兩個具體集合實現。
PriorityQueue 類實質上維護了一個有序列表。加入到 Queue 中的元素根據它們的天然排序(透過其 java.util.Comparable 實現)或者根據傳遞給建構函式的 java.util.Comparator 實現來定位。
ConcurrentLinkedQueue 是基於連結節點的、執行緒安全的佇列。併發訪問不需要同步。因為它在佇列的尾部新增元素並從頭部刪除它們,所以只要不需要知道佇列的大小,ConcurrentLinkedQueue 對公共集合的共享訪問就可以工作得很好。收集關於佇列大小的資訊會很慢,需要遍歷佇列。
------------------------------------------------------------------
實現阻塞介面的:
新的 java.util.concurrent 包在 Collection Framework 中可用的具體集合類中加入了 BlockingQueue 介面和五個阻塞佇列類。
它實質上就是一種帶有一點扭曲的 FIFO 資料結構。不是立即從佇列中新增或者刪除元素,執行緒執行操作阻塞,直到有空間或者元素可用。
五個佇列所提供的各有不同:
* ArrayBlockingQueue :一個由陣列支援的有界佇列。
* LinkedBlockingQueue :一個由連結節點支援的可選有界佇列。
* PriorityBlockingQueue :一個由優先順序堆支援的無界優先順序佇列。
* DelayQueue :一個由優先順序堆支援的、基於時間的排程佇列。
* SynchronousQueue :一個利用 BlockingQueue 介面的簡單聚集(rendezvous)機制。
前兩個類 ArrayBlockingQueue 和 LinkedBlockingQueue 幾乎相同,只是在後備儲存器方面有所不同, LinkedBlockingQueue 並不總是有容量界限。無大小界限的 LinkedBlockingQueue 類在新增元素時永遠不會有阻塞佇列的等待(至少在其中有Integer.MAX_VALUE 元素之前不會)。
PriorityBlockingQueue 是具有無界限容量的佇列,它利用所包含元素的 Comparable 排序順序來以邏輯順序維護元素。可以將它看作 TreeSet 的可能替代物。不過對 PriorityBlockingQueue 有一個技巧。從 iterator() 返回的 Iterator 例項不需要以優先順序順序返回元素。如果必須以優先順序順序遍歷所有元素,那麼讓它們都透過 toArray() 方法並自己對它們排序,像 Arrays.sort(pq.toArray())。
新的 DelayQueue 實現可能是其中最有意思(也是最複雜)的一個。加入到佇列中的元素必須實現新的 Delayed 介面(只有一個方法 —— long getDelay(java.util.concurrent.TimeUnit unit) )。因為佇列的大小沒有界限,使得新增可以立即返回,但是在延遲時間過去之前不能從佇列中取出元素。如果多個元素完成了延遲,那麼最早失效/失效時間最長的元素將第一個取出。實際上沒有聽上去這樣複雜。
SynchronousQueue 類是最簡單的。它沒有內部容量。它就像執行緒之間的手遞手機制。在佇列中加入一個元素的生產者會等待另一個執行緒的消費者。當這個消費者出現時,這個元素就直接在消費者和生產者之間傳遞,永遠不會加入到阻塞佇列中。
----------------------------------------------
實驗結果:
文件說BlockingQueue的佇列: 不是立即從佇列中新增或者刪除元素,執行緒執行操作阻塞,直到有空間或者元素可用。
實驗了一下,使用put、take是這樣子的,執行緒在等待
而使用offer是立刻返回false的
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/855/viewspace-958440/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Python學習筆記 - queuePython筆記
- C++ 學習筆記之——STL 庫 queueC++筆記
- java學習之道 --- 如何學習java?Java
- Java集合(七) Queue詳解Java
- Java 學習Java
- Java學習Java
- 新手如何學習Java——Java學習路線圖Java
- Java學習之路 -- Java怎麼學?Java
- 《JAVA學習指南》學習筆記Java筆記
- 【拉勾教育】學習筆記之集合類庫(Iterator、foreach、List、Queue)筆記
- java Queue佇列相關總結Java佇列
- Java多執行緒Queue總結Java執行緒
- Java學習—java-RedisJavaRedis
- java學習之路Java
- Java學習自學Java
- Java學習方法Java
- Java學習:反射Java反射
- Java學習_反射Java反射
- 學習Java系列Java
- java學習6Java
- 如何學習JavaJava
- 學習java之路Java
- Java學習概要Java
- Java NIO 學習Java
- Java的學習Java
- Java反射學習Java反射
- java如何學習Java
- java學習02Java
- java學習03Java
- java學習06Java
- java學習9.21Java
- java學習3Java
- Java學習(1)Java
- Java學習(3)Java
- java學習9.13Java
- java學習7Java
- [Yii2] yii2-queue 基於redis 佇列測試學習Redis佇列
- Java 基礎(六)集合原始碼解析 QueueJava原始碼