BlockingQueue
獲取元素的時(shí)候等待隊(duì)列里有元素,否則阻塞
保存元素的時(shí)候等待隊(duì)列里有空間,否則阻塞
用來簡(jiǎn)化生產(chǎn)者消費(fèi)者在多線程環(huán)境下的開發(fā)
ArrayBlockingQueue
FIFO、數(shù)組實(shí)現(xiàn)
有界阻塞隊(duì)列,一旦指定了隊(duì)列的長(zhǎng)度,則隊(duì)列的大小不能被改變
在生產(chǎn)者消費(fèi)者例子中,如果生產(chǎn)者生產(chǎn)實(shí)體放入隊(duì)列超過了隊(duì)列的長(zhǎng)度,則在offer(或者put,add)的時(shí)候會(huì)被阻塞,直到隊(duì)列的實(shí)體數(shù)量< 隊(duì)列的初始size為止。不過可以設(shè)置超時(shí)時(shí)間,超時(shí)后隊(duì)列還未空出位置,則offer失敗。
如果消費(fèi)者發(fā)現(xiàn)隊(duì)列里沒有可被消費(fèi)的實(shí)體時(shí)也會(huì)被阻塞,直到有實(shí)體被生產(chǎn)出來放入隊(duì)列位置,不過可以設(shè)置等待的超時(shí)時(shí)間,超過時(shí)間后會(huì)返回null
DelayQueue
有界阻塞延時(shí)隊(duì)列,當(dāng)隊(duì)列里的元素延時(shí)期未到是,通過take方法不能獲取,會(huì)被阻塞,直到有元素延時(shí)到期為止
如:
1.obj 5s 延時(shí)到期
2.obj 6s 延時(shí)到期
3.obj 9s 延時(shí)到期
那么在take的時(shí)候,需要等待5秒鐘才能獲取第一個(gè)obj,再過1s后可以獲取第二個(gè)obj,再過3s后可以獲得第三個(gè)obj
這個(gè)隊(duì)列可以用來處理session過期失效的場(chǎng)景,比如session在創(chuàng)建的時(shí)候設(shè)置延時(shí)到期時(shí)間為30分鐘,放入延時(shí)隊(duì)列里,然后通過一個(gè)線程來獲取這個(gè)隊(duì)列元素,只要能被獲取到的,表示已經(jīng)是過期的session,被獲取的session可以肯定超過30分鐘了,這時(shí)對(duì)session進(jìn)行失效。
LinkedBlockingQueue
FIFO、Node鏈表結(jié)構(gòu)
可以通過構(gòu)造方法設(shè)置capacity來使得阻塞隊(duì)列是有界的,也可以不設(shè)置,則為無界隊(duì)列
其他功能類似ArrayBlockingQueue
PriorityBlockingQueue
無界限隊(duì)列,相當(dāng)于PriorityQueue + BlockingQueue
插入的對(duì)象必須是可比較的,或者通過構(gòu)造方法實(shí)現(xiàn)插入對(duì)象的比較器Comparator<? super E>
隊(duì)列里的元素按Comparator<? super E> comparator比較結(jié)果排序,PriorityBlockingQueue可以用來處理一些有優(yōu)先級(jí)的事物。比如短信發(fā)送優(yōu)先級(jí)隊(duì)列,隊(duì)列里已經(jīng)有某企業(yè)的100000條短信,這時(shí)候又來了一個(gè)100條緊急短信,優(yōu)先級(jí)別比較高,可以通過PriorityBlockingQueue來輕松實(shí)現(xiàn)這樣的功能。這樣這個(gè)100條可以被優(yōu)先發(fā)送
SynchronousQueue
無內(nèi)部容量的阻塞隊(duì)列,put必須等待take,同樣take必須等待put。比較適合兩個(gè)線程間的數(shù)據(jù)傳遞。異步轉(zhuǎn)同步的場(chǎng)景不太適用,因?yàn)閷?duì)于異步線程來說在處理完事務(wù)后進(jìn)行put,但是必須等待put的值被取走。