新聞中心
線(xiàn)程池的各種參數(shù)

我們注重客戶(hù)提出的每個(gè)要求,我們充分考慮每一個(gè)細(xì)節(jié),我們積極的做好做網(wǎng)站、成都網(wǎng)站制作服務(wù),我們努力開(kāi)拓更好的視野,通過(guò)不懈的努力,創(chuàng)新互聯(lián)贏(yíng)得了業(yè)內(nèi)的良好聲譽(yù),這一切,也不斷的激勵(lì)著我們更好的服務(wù)客戶(hù)。 主要業(yè)務(wù):網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)站設(shè)計(jì),微信小程序開(kāi)發(fā),網(wǎng)站開(kāi)發(fā),技術(shù)開(kāi)發(fā)實(shí)力,DIV+CSS,PHP及ASP,ASP.Net,SQL數(shù)據(jù)庫(kù)的技術(shù)開(kāi)發(fā)工程師。
面試的時(shí)候最常問(wèn)的就是線(xiàn)程池的各種參數(shù)的含義,和線(xiàn)程池的整個(gè)運(yùn)行流程,這個(gè)一定要會(huì)
ThreadPoolExecutor一共有4個(gè)構(gòu)造函數(shù),但最后調(diào)用的都是如下構(gòu)造函數(shù)
| 參數(shù) | 含義 |
|---|---|
| corePoolSize | 核心線(xiàn)程池大小 |
| maximumPoolSize | 線(xiàn)程池最大容量大小 |
| keepAliveTime | 線(xiàn)程池空閑時(shí),線(xiàn)程存活的時(shí)間 |
| TimeUnit | 線(xiàn)程活動(dòng)保持時(shí)間的單位 |
| BlockingQueue |
任務(wù)隊(duì)列,用于保存等待執(zhí)行的任務(wù)的阻塞隊(duì)列 |
| ThreadFactory | 用于設(shè)置線(xiàn)程的工廠(chǎng) |
| RejectedExecutionHandler | 飽和策略 |
來(lái)類(lèi)比學(xué)習(xí)一下這些參數(shù),我們把線(xiàn)程池類(lèi)比為項(xiàng)目組,線(xiàn)程是這個(gè)公司的成員
corePoolSize:線(xiàn)程池中最少的線(xiàn)程數(shù),一個(gè)項(xiàng)目組總得有corePoolSize人堅(jiān)守陣地,都是簽訂勞動(dòng)合同了,不能隨便撤。
maximumPoolSize:當(dāng)項(xiàng)目很忙時(shí),就得加人,請(qǐng)其他項(xiàng)目組的人來(lái)幫忙。但是公司空間有限,最多只能加到maximumPoolSize個(gè)人。當(dāng)項(xiàng)目閑了,就得撤人了,最多能撤到corePoolSize個(gè)人
keepAliveTime & unit:上面提到項(xiàng)目根據(jù)忙閑來(lái)增減人員,那在編程世界里,如何定義忙和閑呢?如果一個(gè)線(xiàn)程在keepAliveTime(時(shí)間數(shù)字)* unit(時(shí)間單位)時(shí)間內(nèi)都沒(méi)有執(zhí)行任務(wù),說(shuō)明這個(gè)線(xiàn)程很閑。如果此時(shí)線(xiàn)程數(shù)大于corePoolSize,這個(gè)線(xiàn)程就要被回收了
workQueue:就是任務(wù)隊(duì)列
threadFactory:自定義如果創(chuàng)建線(xiàn)程,例如給線(xiàn)程指定一個(gè)有意義的名字
handler:workQueue滿(mǎn)了(排期滿(mǎn)了),再提交任務(wù),該怎么處理呢?這個(gè)就是處理策略,線(xiàn)程池提供了4種策略,你也可以實(shí)現(xiàn)RejectedExecutionHandler接口來(lái)自定義策略
| 類(lèi) | 策略 |
|---|---|
| AbortPolicy | 丟棄任務(wù),拋運(yùn)行時(shí)異常(默認(rèn)的處理策略) |
| CallerRunsPolicy | 執(zhí)行任務(wù) |
| DiscardPolicy | 忽視,什么都不會(huì)發(fā)生 |
| DiscardOldestPolicy | 丟棄隊(duì)列里最近的一個(gè)任務(wù),并執(zhí)行當(dāng)前任務(wù) |
線(xiàn)程池的工作流程
可以參照一下源碼理解一下下面的流程
1.線(xiàn)程池剛創(chuàng)建時(shí),里面沒(méi)有一個(gè)線(xiàn)程。任務(wù)隊(duì)列是作為參數(shù)傳進(jìn)來(lái)的。不過(guò),就算隊(duì)列里面有任務(wù),線(xiàn)程池也不會(huì)馬上執(zhí)行他們。
2.當(dāng)調(diào)用execute()方法添加一個(gè)任務(wù)時(shí),線(xiàn)程池會(huì)做如下判斷:
a. 如果正在運(yùn)行的線(xiàn)程數(shù)量小于corePoolSize,那么馬上創(chuàng)建線(xiàn)程運(yùn)行這個(gè)任務(wù)
b. 如果正在運(yùn)行的線(xiàn)程數(shù)量大于或等于corePoolSize,那么將這個(gè)任務(wù)放入隊(duì)列
c. 如果這時(shí)候隊(duì)列滿(mǎn)了,而且正在運(yùn)行的線(xiàn)程數(shù)量小于maximunPoolSize,那么還是要?jiǎng)?chuàng)建非核心線(xiàn)程立刻運(yùn)行這個(gè)任務(wù)
d. 如果隊(duì)列滿(mǎn)了,而且正在運(yùn)行的線(xiàn)程數(shù)量大于或等于maximunPoolSize,那么線(xiàn)程池會(huì)拋出RejectedExecutionException
3.當(dāng)一個(gè)線(xiàn)程完成任務(wù)時(shí),它會(huì)從隊(duì)列中取下一個(gè)任務(wù)來(lái)執(zhí)行
4.當(dāng)一個(gè)線(xiàn)程無(wú)事可做,超過(guò)一定的時(shí)間(keepAliveTime)時(shí),線(xiàn)程池會(huì)判斷,如果當(dāng)前運(yùn)行的線(xiàn)程數(shù)大于corePoolSize,那么這個(gè)線(xiàn)程就被停掉。所以線(xiàn)程池的所有任務(wù)完成后,它最終會(huì)收縮到corePoolSize的大小
可以用如下圖來(lái)表示整體流程
本文轉(zhuǎn)載自微信公眾號(hào)「 Java識(shí)堂」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系 Java識(shí)堂公眾號(hào)。
網(wǎng)頁(yè)名稱(chēng):如果我一直往線(xiàn)程池里面放任務(wù),會(huì)發(fā)生什么?
文章源于:http://m.fisionsoft.com.cn/article/dpogcso.html


咨詢(xún)
建站咨詢(xún)
