最近分析sparkstreaming源碼時(shí)步咪,發(fā)現(xiàn)內(nèi)部block是用ArrayBlockingQueue存儲(chǔ)的侣诺,特總結(jié)一下相關(guān)知識(shí)坷备。
BlockQueue
顧名思義,阻塞隊(duì)列情臭,符合典型的生產(chǎn)者-消費(fèi)者模型:當(dāng)隊(duì)列空時(shí)省撑,消費(fèi)者會(huì)自動(dòng)掛起等待;當(dāng)隊(duì)列滿時(shí)俯在,生產(chǎn)者會(huì)自動(dòng)的掛起等待竟秫。
隊(duì)列依據(jù)訪問(wèn)方式不同,分為兩種:
先進(jìn)先出(FIFO):事件排隊(duì)跷乐,依次處理肥败。
后進(jìn)先出(LIFO):處理最新的事件,及時(shí)性好,但可能會(huì)饑餓馒稍。
核心方法
添加數(shù)據(jù):
offer(E object):將object放入queue中皿哨,成功則返回true,失敗返回false纽谒。該方法不阻塞证膨,即若queue滿,則立即返回false鼓黔。
offer(E object, long timeout, TimeUnit unit):設(shè)置等待時(shí)間timeout央勒,在指定的等待時(shí)間內(nèi)添加成功都返回true,否則返回false澳化。
put(E object):將object放入queue中崔步,若queue滿,則阻塞等待缎谷,直到queue不滿時(shí)井濒,被喚醒添加數(shù)據(jù)。
獲取數(shù)據(jù):
poll(long timeout, TimeUnit unit):設(shè)置等待時(shí)間timeout慎陵,在指定的等待時(shí)間內(nèi)獲取數(shù)據(jù)便返回該object眼虱,否則返回null。
take():獲取object席纽,若queue為空捏悬,則阻塞等待,直到queue中有數(shù)據(jù)時(shí)润梯,被喚醒獲取數(shù)據(jù)过牙。
子類
ArrayBlockingQueue:
由數(shù)組組成的有界阻塞隊(duì)列,符合FIFO纺铭,生產(chǎn)者和消費(fèi)者公用一個(gè)鎖寇钉,所以不是真正的并行。
LinkedBlockingQueue:
由鏈表組成的可改變大小的阻塞隊(duì)列舶赔,符合FIFO扫倡,生產(chǎn)者和消費(fèi)者各自使用獨(dú)立的鎖,真正的并行竟纳。在默認(rèn)隊(duì)列大心炖!(Integer.MAX_VALUE)時(shí),消費(fèi)者速率過(guò)快會(huì)導(dǎo)致內(nèi)存耗盡锥累。
DelayQueue:
隊(duì)列大小沒(méi)有限制缘挑,生產(chǎn)者永遠(yuǎn)不會(huì)阻塞,消費(fèi)者只有當(dāng)其指定的延遲時(shí)間到了桶略,才能夠從隊(duì)列中獲取到該元素语淘,否則會(huì)被阻塞诲宇。
PriorityBlockingQueue:
類似LinkedBlockingQueue,排序不是FIFO惶翻,而是依據(jù)對(duì)象的自然排序順序或者是構(gòu)造函數(shù)所帶的Comparator決定的順序姑蓝。生產(chǎn)者不會(huì)阻塞,消費(fèi)者會(huì)阻塞维贺,生產(chǎn)者過(guò)快時(shí)它掂,會(huì)耗盡內(nèi)存。
SynchronousQueue:
同步隊(duì)列溯泣。容量可以看成1虐秋,每個(gè)插入必須等待另一個(gè)線程移除,反之亦然垃沦。
References: