BlockingQueue
- 不僅擁有隊(duì)列的完整功能杯聚,在多線程條件下,還管理多線程間的自動(dòng)等待营密,喚醒等功能械媒;
- 在某些情況下對(duì)阻塞隊(duì)列的訪問可能造成阻塞,被阻塞的情況主要有2種:
- 當(dāng)一個(gè)線程試圖對(duì)一個(gè)已經(jīng)滿了的隊(duì)列進(jìn)行入隊(duì)操作评汰,其將被阻塞纷捞,除非有另一個(gè)線程做了出隊(duì)列操作;
- 當(dāng)一個(gè)線程試圖對(duì)一個(gè)空隊(duì)列進(jìn)行出隊(duì)操作被去,其將被阻塞主儡,除非有另一個(gè)線程做了入隊(duì)列操作;
- 阻塞隊(duì)列是線程安全的惨缆;
- 主要用在生產(chǎn)者/消費(fèi)者場(chǎng)景糜值,負(fù)責(zé)生產(chǎn)的線程不斷制造新對(duì)象并插入到阻塞隊(duì)列丰捷,直到到達(dá)隊(duì)列的上限值,生產(chǎn)線程將被阻塞寂汇,直到消費(fèi)者線程開始消費(fèi)病往;負(fù)責(zé)消費(fèi)的線程不斷從隊(duì)列中消費(fèi)對(duì)象,直到隊(duì)列為空骄瓣,消費(fèi)線程將被阻塞停巷,除非隊(duì)列中有新的對(duì)向插入;
BlockingQueue的實(shí)現(xiàn)類
- ArrayBlockingQueue:有界的阻塞隊(duì)列(容量有限榕栏,必須在初始化的時(shí)候指定容量大小畔勤,一旦指定就無(wú)法修改),內(nèi)部實(shí)現(xiàn)是數(shù)組扒磁,以先進(jìn)先出的方式存儲(chǔ)數(shù)據(jù)庆揪;
- DelayQueue:其中元素必須實(shí)現(xiàn)java.util.concurrent.Delayed接口,其中元素是要可比的妨托,一般以過(guò)期時(shí)間作為排序規(guī)則缸榛;
- LinkedBlockingQueue:大小可選,如果初始化的時(shí)候指定大小就是有邊界的始鱼,如果沒有指定大小就是無(wú)邊界的仔掸,先進(jìn)先出脆贵;
- PriorityBlockingQueue:帶優(yōu)先級(jí)的阻塞隊(duì)列医清,無(wú)邊界,有排序規(guī)則卖氨,允許插入null会烙,所有插入進(jìn)PriorityBlockingQueue的對(duì)象要求實(shí)現(xiàn)Comparable接口,可以從PriorityBlockingQueue中獲得一個(gè)迭代器筒捺,但迭代器并不保證按優(yōu)先級(jí)順序進(jìn)行迭代柏腻;
- SynchronousQueue:內(nèi)部?jī)H允許容納一個(gè)元素,當(dāng)一個(gè)線程插入一個(gè)元素時(shí)就會(huì)被阻塞系吭,除非這個(gè)元素被另一個(gè)線程消費(fèi)五嫂;