Queue: 基本上,一個隊列就是一個先入先出(FIFO)的數據結構java
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接口的和沒有實現的
1)沒有實現的阻塞接口的LinkedList: 實現了java.util.Queue接口和java.util.AbstractQueue接口
內置的不阻塞隊列: PriorityQueue 和 ConcurrentLinkedQueue
PriorityQueue 和 ConcurrentLinkedQueue 類在 Collection Framework 中加入兩個具體集合實現。
PriorityQueue 類實質上維護了一個有序列表。加入到 Queue 中的元素根據它們的自然排序(經過其 java.util.Comparable 實現)或者根據傳遞給構造函數的 java.util.Comparator 實現來定位。
ConcurrentLinkedQueue 是基於連接節點的、線程安全的隊列。併發訪問不須要同步。由於它在隊列的尾部添加元素並從頭部刪除它們,因此只要不須要知道隊列的大 小,ConcurrentLinkedQueue 對公共集合的共享訪問就能夠工做得很好。收集關於隊列大小的信息會很慢,須要遍歷隊列。
2)實現阻塞接口的:
新 的 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 類是最簡單的。它沒有內部容量。它就像線程之間的手遞手機制。在隊列中加入一個元素的生產者會等待另外一個線程的消費者。當這個消費者出現時,這個元素就直接在消費者和生產者之間傳遞,永遠不會加入到阻塞隊列中。併發