Java 隊列詳細介紹

參考文檔:http://docs.oracle.com/javase/8/docs/api/html

 

Queue隊列的全部已知實現類:java

該接口繼承Iterable,Collection接口.除了繼承的接口的方法外,它有自身操做隊列的一些公有的方法:offer/poll/peek.api

隊列裏面的插入:offer,取出頂層元素:poll,查詢頂層元素:peek/element.不建議使用集合類的方法,add,remove,addAll.由於操做失敗是報異常,須要去捕獲異常而後調用線程等待之類的方法.數組

另外,隊列的傳入值通常不建議插入null.安全

子接口:

 

  1. BlockingQueue<E>,
    1. 集合類方法:add/remove/addAll等,在操做失敗拋出異常.
    2. 隊列方法:offer/poll/peek,在操做失敗返回null或者false.
    3. 隊列方法put/take/操做失敗一直重試.
    4. 隊列方法:put(e,time,unit),重試最大時間,若是仍是失敗就退出.
    5. 不允許插入null對象,若是取出頂層元素失敗(執行poll),則返回null.
    6. 多是有邊界的,這種狀況下,該隊列若是制定邊界.那麼超過邊界的對象再也不被接受.若是沒指名邊界,那麼邊界就是整行的最大值.
    7. 不支持close/shutdown這樣的方法,線程安全.
    8. 是BlockingDeque,Transfer的父接口.
    9. 通常該實現類都有邊界.由於是阻塞的.
  2. Deque<E>,
    1. 雙端隊列接口,繼承自Queue.子接口BlockingDeque.
    2. 該接口的實現類通常都是無邊界的隊列(大小自由).
    3. 首端元素的添加/取出/查詢:offerFrist/pollFrist/peekFrist.尾端爲Last.
    4. 也可使用Queue接口的方法:poll,peek.操做首端元素.這裏的offer方法操做的是尾端元素.從尾端添加.首端添加是Stack的push方法.或者offerFrist方法.
    5. 使用Stack方法:push,pop,peek操做首端元素.
  3. BlockingDeque<E>,
    1. 繼承自BlockingQueue與Deque接口.具備兩者的共性.
    2. 雙端阻塞隊列,因此操做方法是addFrist/addLast,removeFrist/removeLast...這樣的方法.
    3. 操做失敗特性與BrokingQueue同樣.
  4. TransferQueue<E>
    1. 繼承自BlockingQueue接口.
    2. 使用場景:生產者-->消費者.生產這產生對象,添加到轉移隊列,消費者從轉移隊列取出對象.
    3. 通常該接口的實現類是有邊界的.這種狀況下,若是消費者一直沒有去走元素,那麼該生產這就不能在隊列滿的狀況下繼續添加.必需要等到隊列空出位置.
    4. getWaitingConsumerCount()方法:查詢消費者的數量.
    5. hasWaitConsumer() :是否有消費者正在等待消費.
    6. transfer(E e) :轉移對象給消費者.若是沒有消費者,則一直等待.
    7. tryTransfer(E e) :當即轉移給消費者.沒有返回false.
    8. tryTransfer(E e,long time,timeUnit unit) :嘗試轉移,等待最大時間以後就再也不等待.
    9. 其餘方法與其父接口一致.

子實現類:

  1. AbstractQueue,
    1. 抽象類,全部子隊列的頂層.
    2. 實現Queue的接口.因此Queue接口的方法都具備.
    3. 下面的類都是該類的子類.下面再也不重複說明.
  2. ArrayBlockingQueue,
    1. 基於數組實現的阻塞隊列.擁有邊界.
    2. 實現BlockingQueue接口與序列化接口.
  3. ArrayDeque,
    1. 基於數組的雙端隊列.無界,初始化未指定大小,默認爲16容量.
    2. 實現Deque接口,克隆接口,序列化接口.
    3. 關於克隆接口:Cloneable
  4. ConcurrentLinkedDeque,
    1. 基於鏈表實現的沒有邊界的同步雙端隊列.
    2. 適用線程安全的多線程併發插入/移除/訪問等操做.
    3. 由於是雙端操做,因此集合類的方法遍歷可能結果不許確.
    4. 不允許插入null值.
  5. ConcurrentLinkedQueue,
    1. 基於鏈表實現的沒邊界的同步隊列.
    2. 與以前的同樣,也是線程安全的.
    3. 一樣不允許插入null.這一條以後再也不重複.通常隊列都不允許插入null.
  6. DelayQueue,
    1. 無界延遲隊列.只有到達時間的對象才能被消費.
    2. 實現BlockingQueue接口.
    3. 傳入參數必須是實現Delayed接口的對象
    4. 方法多了個size/take..
  7. LinkedBlockingDeque,
    1. 基於鏈表的雙端隊列.有界,若是初始化未指定容量大小,則默認爲整型最大值.
    2. 實現BlcokingDeque與序列化接口.
    3. 方法定義與BlockingQueue一致性.
  8. LinkedBlockingQueue,
    1. 基於鏈表的阻塞隊列,若是初始化時候沒有制定大小.默認爲整型最大值.
    2. 遵循FIFO,鏈接的節點在插入新的對象時候動態建立,知道超出容量限制.
  9. LinkedList,
    1. 實現List<E>, Deque<E>, Cloneable, Serializable,接口.
    2. 實現模式是雙端隊列,使用兩條鏈表操做.該隊列是非同步的.
    3. 官方給出同步的處理方式:Collections.synchronizedList(new LinkedList(...)
  10. LinkedTransferQueue,
    1. 基於鏈表實現的傳輸隊列.無界
    2. 實現TransferQueue與序列化接口.
    3. 跟大部分非同步隊列同樣,因爲多線程異步的緣由,size方法取到的值不能做爲準確的判斷隊列的數量.建議使用隊列的方法取出.
  11. PriorityQueue,
    1. 指定順序的隊列(優先級),無界.
    2. 繼承自AbstractQueue抽象類.傳入對象須要實現排序接口 Comparator 來排序.
    3. 初始化未指定參數,默認容量爲11,排序方式爲天然排序: natural ordering.
  12. PriorityBlockingQueue,
    1. 優先阻塞隊列,無界.
    2. 實現阻塞接口與序列化接口.
    3. 與阻塞隊列相比,它多了一個排序的功能.
  13. SynchronousQueue
    1. 同步隊列,無界.
    2. 實現BlockingQueue接口與序列化接口.
    3. 能夠指定是否FIFO,初始化默認是非公平隊列.即不保證先插入的元素必定最早取出.

瞭解隊列特性,建議先了解接口特性.例外的就只有同步隊列/排序隊列(姑且這麼翻譯)不是實現接口而產生的功能,其餘大致都是接口定義的特性.多線程

相關文章
相關標籤/搜索