阻塞隊(duì)列

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的值被取走。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 隊(duì)列 隊(duì)列是先進(jìn)先出(FIFO)的線性表。在具體應(yīng)用中通常用鏈表或者數(shù)組來實(shí)現(xiàn)。隊(duì)列只允許在后端(稱為rear)進(jìn)...
    Showdy閱讀 478評(píng)論 0 0
  • 相關(guān)文章Java并發(fā)編程(一)線程定義、狀態(tài)和屬性 Java并發(fā)編程(二)同步Java并發(fā)編程(三)volatil...
    劉望舒閱讀 5,295評(píng)論 1 31
  • 阻塞隊(duì)列(BlockingQueue)是一個(gè)支持兩個(gè)附加操作的隊(duì)列。這兩個(gè)附加的操作是:在隊(duì)列為空時(shí),獲取元素的線...
    端木軒閱讀 1,061評(píng)論 0 2
  • 每周學(xué)財(cái)報(bào),學(xué)投資,這周我們的學(xué)習(xí)對(duì)象是——小米科技。 5月3日,獨(dú)角獸小米科技向港交所遞交了招股說明書,從201...
    研究型投資閱讀 723評(píng)論 0 0
  • 你有沒有想過 風(fēng)是往哪個(gè)方向吹 樹葉是往哪塊磚上落 風(fēng)里的沙會(huì)歸往何處 你有沒有看過 周邊匆匆走過的人 他們的衣服...
    上官四月閱讀 123評(píng)論 0 0

友情鏈接更多精彩內(nèi)容