BlockingQueue線程池的數(shù)據(jù)結(jié)構(gòu)是阻塞隊(duì)列BlockingQueue。(在多線程領(lǐng)域:所謂阻塞,在某些情況下會(huì)掛起線程(即阻塞),一旦條件滿足,被掛起的線程又會(huì)自動(dòng)被喚醒)
ArrayBlockingQueue
基于數(shù)組的阻塞隊(duì)列實(shí)現(xiàn),在ArrayBlockingQueue內(nèi)部,維護(hù)了一個(gè)定長(zhǎng)數(shù)組,以便緩存隊(duì)列中的數(shù)據(jù)對(duì)象,這是一個(gè)常用的阻塞隊(duì)列,除了一個(gè)定長(zhǎng)數(shù)組外,ArrayBlockingQueue內(nèi)部還保存著兩個(gè)整形變量,分別標(biāo)識(shí)著隊(duì)列的頭部和尾部在數(shù)組中的位置。
LinkedBlockingQueue
基于鏈表的阻塞隊(duì)列,同ArrayListBlockingQueue類似,其內(nèi)部也維持著一個(gè)數(shù)據(jù)緩沖隊(duì)列(該隊(duì)列由一個(gè)鏈表構(gòu)成),當(dāng)生產(chǎn)者往隊(duì)列中放入一個(gè)數(shù)據(jù)時(shí),隊(duì)列會(huì)從生產(chǎn)者手中獲取數(shù)據(jù),并緩存在隊(duì)列內(nèi)部,而生產(chǎn)者立即返回;只有當(dāng)隊(duì)列緩沖區(qū)達(dá)到最大值緩存容量時(shí)(LinkedBlockingQueue可以通過(guò)構(gòu)造函數(shù)指定該值,盡量指定,否則容易一直緩存導(dǎo)致內(nèi)存溢出),才會(huì)阻塞生產(chǎn)者隊(duì)列,直到消費(fèi)者從隊(duì)列中消費(fèi)掉一份數(shù)據(jù),生產(chǎn)者線程會(huì)被喚醒,反之對(duì)于消費(fèi)者這端的處理也基于同樣的原理。
ArrayBlockingQueue和LinkedBlockingQueue區(qū)別:
ArrayBlockingQueue中的鎖是沒(méi)有分離的,即生產(chǎn)和消費(fèi)用的是同一個(gè)鎖;
LinkedBlockingQueue中的鎖是分離的
ArrayBlockingQueue基于數(shù)組,在生產(chǎn)和消費(fèi)的時(shí)候,不產(chǎn)生額外的對(duì)象實(shí)例;
LinkedBlockingQueue基于鏈表,在生產(chǎn)和消費(fèi)的時(shí)候,會(huì)生成額外的Node對(duì)象;
ArrayBlockingQueue是有界的,必須指定隊(duì)列的大??;
LinkedBlockingQueue是無(wú)界的,可以不指定隊(duì)列的大小,但是默認(rèn)是Integer.MAX_VALUE。