阻塞隊列

概念、生產者消費者模式 

1)當隊列滿的時候,插入元素的線程被阻塞,直達隊列不滿。數組

2)隊列爲空的時候,獲取元素的線程被阻塞,直到隊列不空。緩存

生產者和消費者模式

生產者就是生產數據的線程,消費者就是消費數據的線程。在多線程開發中,若是生產者處理速度很快,而消費者處理速度很慢,那麼生產者就必須等待消費者處理完,才能繼續生產數據。一樣的道理,若是消費者的處理能力大於生產者,那麼消費者就必須等待生產者。爲了解決這種生產消費能力不均衡的問題,便有了生產者和消費者模式。生產者和消費者模式是經過一個容器來解決生產者和消費者的強耦合問題。生產者和消費者彼此之間不直接通訊,而是經過阻塞隊列來進行通訊,因此生產者生產完數據以後不用等待消費者處理,直接扔給阻塞隊列,消費者不找生產者要數據,而是直接從阻塞隊列裏取,阻塞隊列就至關於一個緩衝區,平衡了生產者和消費者的處理能力。多線程

經常使用方法 

方法spa

拋出異常線程

返回值排序

一直阻塞接口

超時退出隊列

插入方法ci

addelement

offer

put

Offer(time)

移除方法

remove

poll

take

Poll(time)

檢查方法

element

peek

N/A

N/A

  1. 拋出異常:當隊列滿時,若是再往隊列裏插入元素,會拋出IllegalStateException("Queuefull")異常。當隊列空時,從隊列裏獲取元素會拋出NoSuchElementException異常。
  2. 返回特殊值:當往隊列插入元素時,會返回元素是否插入成功,成功返回true。若是是移除方法,則是從隊列裏取出一個元素,若是沒有則返回null。
  3. 一直阻塞:當阻塞隊列滿時,若是生產者線程往隊列裏put元素,隊列會一直阻塞生產者線程,直到隊列可用或者響應中斷退出。當隊列空時,若是消費者線程從隊列裏take元素,隊列會阻塞住消費者線程,直到隊列不爲空。
  4. 超時退出:當阻塞隊列滿時,若是生產者線程往隊列裏插入元素,隊列會阻塞生產者線程一段時間,若是超過了指定的時間,生產者線程就會退出。

 

經常使用阻塞隊列 

·ArrayBlockingQueue:一個由數組結構組成的有界阻塞隊列。

按照先進先出原則,要求設定初始大小

·LinkedBlockingQueue:一個由鏈表結構組成的有界阻塞隊列。

按照先進先出原則,能夠不設定初始大小,Integer.Max_Value

ArrayBlockingQueue和LinkedBlockingQueue不一樣:

  1. 鎖上面:ArrayBlockingQueue只有一個鎖,LinkedBlockingQueue用了兩個鎖,
  2. 實現上:ArrayBlockingQueue直接插入元素,LinkedBlockingQueue須要轉換。

·PriorityBlockingQueue:一個支持優先級排序的無界阻塞隊列。

默認狀況下,按照天然順序,要麼實現compareTo()方法,指定構造參數Comparator

·DelayQueue:一個使用優先級隊列實現的無界阻塞隊列。

支持延時獲取的元素的阻塞隊列,元素必需要實現Delayed接口。適用場景:實現本身的緩存系統,訂單到期,限時支付等等。

·SynchronousQueue:一個不存儲元素的阻塞隊列。

每個put操做都要等待一個take操做

·LinkedTransferQueue:一個由鏈表結構組成的無界阻塞隊列。

transfer(),必需要消費者消費了之後方法纔會返回,tryTransfer()不管消費者是否接收,方法都當即返回。

·LinkedBlockingDeque:一個由鏈表結構組成的雙向阻塞隊列。

能夠從隊列的頭和尾均可以插入和移除元素,實現工做密取,方法名帶了First對頭部操做,帶了last從尾部操做,另外:add=addLast; remove=removeFirst; take=takeFirst

阻塞隊列的實現原理

好比,ArrayBlockingQueue就是基於Lock和Condition實現的。

相關文章
相關標籤/搜索