1,簡介
1)BlockingQueue接口定義:
繼承Queue接口,并且支持兩個附加操作的隊列。additionally supports operations
獲取元素時,等待隊列非空。wait for the queue to become non-empty when retrieving an element
存儲元素時,等待隊列可用。wait for space to become available in the queue when storing an element
2)應(yīng)用場景:常用于生產(chǎn)者消費者場景
生產(chǎn)者往阻塞隊列中添加元素,當(dāng)隊列滿時,阻塞線程等待隊列可用
消費者從阻塞隊列中獲取元素,當(dāng)隊列空時,阻塞
3)隊列操作
Queue提供:add、remove、element, offer、poll、peek
阻塞隊列額外操作:put、take,超時offer、超時poll
image.png
4)額外操作
put:插入元素,如果必要的話阻塞等待隊列可用。Inserts the specified element into this queue, waiting if necessary for space to become available.
超時offer:插入元素,最多阻塞等待time超時時間隊列可用。waiting up to the specified wait time if necessary for space to become available.
5)生產(chǎn)者消費者模型
image.png
image.png
6)JDK實現(xiàn)類列表
image.png
公平訪問隊列:等待的線程在獲取鎖競爭時,按照等待時間,先等待的先獲取后等待的后獲取
非公平訪問:獲取的時候,所有等待的線程都有可能獲取到鎖
ReentrantLock:控制公平鎖和非公平鎖,公平鎖會降低隊列性能,默認(rèn)使用非公平鎖
2,ArrayBlockingQueue數(shù)組實現(xiàn)的有界隊列,ReentrantLock+條件隊列
image.png
image.png
put實現(xiàn)
image.png
image.png
take實現(xiàn)
image.png
image.png
超時實現(xiàn),基于條件隊列awaitNanos
image.png
image.png
3,LinkedBlockingQueue鏈表實現(xiàn)的capacity或者M(jìn)AX_VALUE的隊列
image.png
image.png
put實現(xiàn)
image.png
take實現(xiàn)
image.png
4,PriorityBlockingQueue基于堆結(jié)構(gòu)的優(yōu)先級無界阻塞隊列
image.png
image.png
put實現(xiàn)
image.png
take實現(xiàn)
image.png
5,SynchronousQueue不存儲元素的阻塞隊列
Transfer接口
put操作的時候e值為數(shù)據(jù)data,take操作的時候e值為null
image.png
TransferQueue實現(xiàn)
image.png
隊列為空或者是和隊尾數(shù)據(jù)類型一致
image.png
image.png
awaitFulfill方法,終止條件是s的值是否被修改。如s節(jié)點是data節(jié)點,就會被修改為null;如果是request節(jié)點,就會被修改為data
image.png
image.png
put和take實現(xiàn)
image.png
image.png