1)當隊列滿的時候,插入元素的線程被阻塞,直達隊列不滿。數組
2)隊列爲空的時候,獲取元素的線程被阻塞,直到隊列不空。緩存
生產者就是生產數據的線程,消費者就是消費數據的線程。在多線程開發中,若是生產者處理速度很快,而消費者處理速度很慢,那麼生產者就必須等待消費者處理完,才能繼續生產數據。一樣的道理,若是消費者的處理能力大於生產者,那麼消費者就必須等待生產者。爲了解決這種生產消費能力不均衡的問題,便有了生產者和消費者模式。生產者和消費者模式是經過一個容器來解決生產者和消費者的強耦合問題。生產者和消費者彼此之間不直接通訊,而是經過阻塞隊列來進行通訊,因此生產者生產完數據以後不用等待消費者處理,直接扔給阻塞隊列,消費者不找生產者要數據,而是直接從阻塞隊列裏取,阻塞隊列就至關於一個緩衝區,平衡了生產者和消費者的處理能力。多線程
方法spa |
拋出異常線程 |
返回值排序 |
一直阻塞接口 |
超時退出隊列 |
插入方法ci |
addelement |
offer |
put |
Offer(time) |
移除方法 |
remove |
poll |
take |
Poll(time) |
檢查方法 |
element |
peek |
N/A |
N/A |
·ArrayBlockingQueue:一個由數組結構組成的有界阻塞隊列。
按照先進先出原則,要求設定初始大小
·LinkedBlockingQueue:一個由鏈表結構組成的有界阻塞隊列。
按照先進先出原則,能夠不設定初始大小,Integer.Max_Value
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實現的。