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

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

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

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

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

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

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

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

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

2018年8月22日 10:01