java隊列Queue及阻塞隊列

java隊列html

接口Queue類在java.util包,定義瞭如下6個方法java

詳細查看官方文檔https://docs.oracle.com/javase/7/docs/api/java/util/Queue.htmlapi

什麼是阻塞隊列 BlockingQueue數組

  隊列是一種數據結構,它的特色是先進先出(First In First Out),它有兩個基本操做:在隊列尾部加入一個元素,從隊列頭部移除一個元素。隊列在多線程應用中,經常使用於生產-消費場景。安全

  BlockingQueue 是 Java util.concurrent 包下重要的數據結構,BlockingQueue 提供了線程安全的隊列訪問方式:當阻塞隊列進行插入數據時,若是隊列已滿,線程將會阻塞等待直到隊列非滿;從阻塞隊列取數據時,若是隊列已空,線程將會阻塞等待直到隊列非空。併發包下不少高級同步類的實現都是基於 BlockingQueue 實現的。數據結構

  BlockingQueue 具備 4 組不一樣的方法用於插入、移除以及對隊列中的元素進行檢查。若是請求的操做不能獲得當即執行的話,每一個方法的表現也不一樣。這些方法以下:多線程

  按照上圖,咱們能夠知道jdk1.5中的阻塞隊列的操做:併發

  add        增長一個元索                     若是隊列已滿,則拋出一個IIIegaISlabEepeplian異常
  remove   移除並返回隊列頭部的元素    若是隊列爲空,則拋出一個NoSuchElementException異常
  element  返回隊列頭部的元素             若是隊列爲空,則拋出一個NoSuchElementException異常
  offer       添加一個元素並返回true       若是隊列已滿,則返回false
  poll         移除並返問隊列頭部的元素    若是隊列爲空,則返回null
  peek       返回隊列頭部的元素             若是隊列爲空,則返回null
  put         添加一個元素                      若是隊列滿,則阻塞
  take        移除並返回隊列頭部的元素     若是隊列爲空,則阻塞oracle

BlockingQueue 是個接口,你須要使用它的實現之一來使用 BlockingQueue,Java.util.concurrent 包下具備如下 BlockingQueue 接口的實現類:框架

ArrayBlockingQueue :一個由數組支持的有界隊列。
LinkedBlockingQueue :一個由連接節點支持的可選有界隊列。
PriorityBlockingQueue :一個由優先級堆支持的無界優先級隊列。
DelayQueue :一個由優先級堆支持的、基於時間的調度隊列。
SynchronousQueue :一個利用 BlockingQueue 接口的簡單彙集(rendezvous)機制。

  ArrayBlockingQueue:ArrayBlockingQueue 是一個有界的阻塞隊列,其內部實現是將對象放到一個數組裏。有界也就意味着,它不可以存儲無限多數量的元素。它有一個同一時間可以存儲元素數量的上限。你能夠在對其初始化的時候設定這個上限,但以後就沒法對這個上限進行修改了。

  DelayQueue:DelayQueue 對元素進行持有直到一個特定的延遲到期。注入其中的元素必須實現 java.util.concurrent.Delayed 接口。

  LinkedBlockingQueue:LinkedBlockingQueue 內部以一個鏈式結構對其元素進行存儲。若是須要的話,這一鏈式結構能夠選擇一個上限。若是沒有定義上限,將使用 Integer.MAX_VALUE 做爲上限。

  PriorityBlockingQueue:PriorityBlockingQueue 是一個無界的併發隊列。它使用了和類 java.util.PriorityQueue 同樣的排序規則。你沒法向這個隊列中插入 null 值。全部插入到 PriorityBlockingQueue 的元素必須實現 java.lang.Comparable 接口。所以該隊列中元素的排序就取決於你本身的 Comparable 實現。

  SynchronousQueue:SynchronousQueue 是一個特殊的隊列,它的內部同時只可以容納單個元素。若是該隊列已有一元素的話,試圖向隊列中插入一個新元素的線程將會阻塞,直到另外一個線程將該元素從隊列中抽走。一樣,若是該隊列爲空,試圖向隊列中抽取一個元素的線程將會阻塞,直到另外一個線程向隊列中插入了一條新的元素。據此,把這個類稱做一個隊列顯然是誇大其詞了。它更多像是一個匯合點。

 

而後能夠聯繫到java集合 list,set

java框架集合圖https://img-blog.csdn.net/20160124221843905

相關文章
相關標籤/搜索