前言
隊列,字面意思就可以明白. 是一種線性的數據暫存與管理工具. 也可以讓各種業務功能進行逐個的隊列運行. 此篇博客只說明一下Java有幾種隊列
未阻塞和阻塞隊列的區別
未阻塞:
1.未阻塞的隊列在並發想隊列添加或者取得數據的時候,必定只會有一個成功,其他都可能添加失敗.
阻塞:
1.阻塞的隊列會進行線程阻塞操作,讓並發的添加或者取得數據進行一定程度的延遲,可以保證大量並發數據的添加. 但是阻塞也是有超時時間的.. 超過一段時間后依然會拋出異常或者拋出false
沒有實現阻塞接口
LinkList
實現java.util.Queue的LinkList,
PriorityQueue
實現java.util.AbstractQueue接口內置的不阻塞隊列
ConcurrentLinkedQueue
實現java.util.AbstractQueue接口內置的不阻塞隊列
實現阻塞接口的
java.util.concurrent 中加入了 BlockingQueue 接口和五個阻塞隊列類。它實質上就是一種帶有一點扭曲的 FIFO 數據結構。不是立即從隊列中添加或者刪除元素,線程執行操作阻塞,直到有空間或者元素可用。
五個隊列所提供的各有不同:
ArrayBlockingQueue :
一個由數組支持的有界隊列。
LinkedBlockingQueue :
一個由鏈接節點支持的可選有界隊列。LinkedBlockingQueue的容量(在不指定時容量為Integer.MAX_VALUE),但是也可以選擇指定其最大容量,它是基於鏈表的隊列,此隊列按 FIFO(先進先出)排序元素。
PriorityBlockingQueue :
一個由優先級堆支持的無界(沒有容量限制)優先級隊列。 是一個帶優先級的 隊列,而不是先進先出隊列。元素按優先級順序被移除.
DelayQueue :
一個由優先級堆支持的、基於時間的調度隊列。(基於PriorityQueue來實現的)是一個存放Delayed 元素的無界阻塞隊列,只有在延遲期滿時才能從中提取元素。該隊列的頭部是延遲期滿后保存時間最長的 Delayed 元素。如果延遲都還沒有期滿,則隊列沒有頭部,並且poll將返回null。當一個元素的 getDelay(TimeUnit.NANOSECONDS) 方法返回一個小於或等於零的值時,則出現期滿,poll就以移除這個元素了。此隊列不允許使用 null 元素。
SynchronousQueue :
一個利用 BlockingQueue 接口的簡單聚集(rendezvous)機制。
