鍍金池/ 問(wèn)答/Java  Linux/ Java的線程池為什么要用阻塞隊(duì)列呢?

Java的線程池為什么要用阻塞隊(duì)列呢?

線程池為什么要用阻塞隊(duì)列呢?使用一般的隊(duì)列也能完整任務(wù)啊?

回答
編輯回答
晚風(fēng)眠

一般的隊(duì)列只能保證作為一個(gè)有限長(zhǎng)度的緩沖區(qū),如果超出了緩沖長(zhǎng)度,就無(wú)法保留當(dāng)前的任務(wù)了,阻塞隊(duì)列通過(guò)阻塞可以保留住當(dāng)前想要繼續(xù)入隊(duì)的任務(wù)。

2017年11月30日 10:57
編輯回答
不舍棄

簡(jiǎn)單的一個(gè)場(chǎng)景,消費(fèi)者一端不一定是時(shí)時(shí)提交任務(wù)就能馬上執(zhí)行,可能有很多因素,比如計(jì)算或者IO等資源沒辦法馬上就位,所以有等待,但是任務(wù)隊(duì)列也不一定就無(wú)限大,所以才有了阻塞隊(duì)列,在任務(wù)池已滿且隊(duì)列已經(jīng)有很多任務(wù)時(shí),需要阻塞等待

2018年3月16日 23:53
編輯回答
尕筱澄

阻塞隊(duì)列主要是用于生產(chǎn)者-消費(fèi)者模型的情況。
比如一個(gè)線程從一個(gè)空的阻塞隊(duì)列中取元素,此時(shí)線程會(huì)被阻塞直到阻塞隊(duì)列中有了元素。當(dāng)隊(duì)列中有元素后,被阻塞的線程會(huì)自動(dòng)被喚醒(不需要我們編寫代碼去喚醒)。這樣提供了極大的方便性。
如果使用非阻塞隊(duì)列,它不會(huì)對(duì)當(dāng)前線程產(chǎn)生阻塞,就必須額外地實(shí)現(xiàn)同步策略以及線程間喚醒策略,這個(gè)實(shí)現(xiàn)起來(lái)就非常麻煩。

2018年8月22日 10:01