线程池中阻塞队列的作用?为什么是先添加列队而不是先创建最大线程?线程池中线程复用原理
1、一般的隊(duì)列只能保證作為一個(gè)有限長度的緩沖區(qū),如果超出了緩沖長度,就無法保留當(dāng)前的任務(wù)了,阻塞隊(duì)列通過阻塞可以保留住當(dāng)前想要繼續(xù)入隊(duì)的任務(wù)。阻塞隊(duì)列可以保證任務(wù)隊(duì)列中沒有任務(wù)時(shí)阻塞獲取任務(wù)的線程,使得線程進(jìn)入wait狀態(tài),釋放cpu資源。阻塞隊(duì)列自帶阻塞和喚醒的功能,不需要額外處理,無任務(wù)執(zhí)行時(shí),線程池利用阻塞隊(duì)列的take方法掛起,從而維持核心線程的存活、不至于一直占用cpu資源
2、在創(chuàng)建新線程的時(shí)候,是要獲取全局鎖的,這個(gè)時(shí)候其它的就得阻塞,影響了整體效率就好比一個(gè)飯店里面有10個(gè)(core)正式工的名額,最多招10個(gè)正式工,要是任務(wù)超過正式工人數(shù)(task>core)的情況下,工廠領(lǐng)導(dǎo)(線程池)不是首先擴(kuò)招工人,還是這10人,但是任務(wù)可以稍微積壓一下,即先放到隊(duì)列去(代價(jià)低) 。10個(gè)正式工慢慢干,遲早會千完的,要是任務(wù)還在繼續(xù)增加,超過正式工的加班忍耐極限了(隊(duì)列滿了) ,就的招外包幫忙了(注意是臨時(shí)工)要是正式工加上外包還是不能完成任務(wù),那新來的任務(wù)就會被領(lǐng)導(dǎo)拒絕了(線程池的拒絕策略)
線程池中線程復(fù)用原理
線程池將線程和任務(wù)進(jìn)行解耦,線程是線程,任務(wù)是任務(wù),擺脫了之前通過Thread創(chuàng)建線程時(shí)的一個(gè)線程必須對應(yīng)一個(gè)任務(wù)的限制。在線程池中,同一個(gè)線程可以從阻塞隊(duì)列中不斷獲取新任務(wù)來執(zhí)行,其核心原理在于線程池對Thread進(jìn)行了封裝,并不是每次執(zhí)行任務(wù)都會調(diào)用Thread.start()來創(chuàng)建新線程,而是讓每個(gè)線程去執(zhí)行一個(gè)"循環(huán)任務(wù)",在這個(gè)"循環(huán)任務(wù)"中不停檢查是否有任務(wù)需要被執(zhí)行,如果有則直接執(zhí)行,也就是調(diào)用任務(wù)中的run方法,將run方法當(dāng)成一個(gè)普通的方法執(zhí)行,通過這種方式只使用固定的線程就將所有任務(wù)的run方法串聯(lián)起來。
總結(jié)
以上是生活随笔為你收集整理的线程池中阻塞队列的作用?为什么是先添加列队而不是先创建最大线程?线程池中线程复用原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 线程池的处理流程和原理
- 下一篇: 理解线程池中线程的复用原理