今天看了一下線程池璧坟,總結(jié)一下秀姐。
創(chuàng)建線程池使用ThreadPoolExecutor 參數(shù)包括corePoolSize?maxPoolSize?keepAliveSeconds ?queueCapacity 等等
corePoolSize:?線程池維護(hù)線程的最少數(shù)量
maximumPoolSize:線程池維護(hù)線程的最大數(shù)量
keepAliveTime:?線程池維護(hù)線程所允許的空閑時(shí)間
unit:?線程池維護(hù)線程所允許的空閑時(shí)間的單位
workQueue:?線程池所使用的緩沖隊(duì)列
handler:?線程池對(duì)拒絕任務(wù)的處理策略
當(dāng)一個(gè)任務(wù)通過execute(Runnable)方法欲添加到線程池時(shí):
l??如果此時(shí)線程池中的數(shù)量小于corePoolSize吗讶,即使線程池中的線程都處于空閑狀態(tài),也要?jiǎng)?chuàng)建新的線程來處理被添加的任務(wù)儡湾。
2??如果此時(shí)線程池中的數(shù)量等于?corePoolSize揉阎,但是緩沖隊(duì)列?workQueue未滿,那么任務(wù)被放入緩沖隊(duì)列蚂维。
3??如果此時(shí)線程池中的數(shù)量大于corePoolSize疟丙,緩沖隊(duì)列workQueue滿,并且線程池中的數(shù)量小于maximumPoolSize鸟雏,建新的線程來處理被添加的任務(wù)。
4??如果此時(shí)線程池中的數(shù)量大于corePoolSize览祖,緩沖隊(duì)列workQueue滿孝鹊,并且線程池中的數(shù)量等于maximumPoolSize,那么通過?handler所指定的策略來處理此任務(wù)展蒂。也就是:處理任務(wù)的優(yōu)先級(jí)為:核心線程corePoolSize又活、任務(wù)隊(duì)列workQueue、最大線程maximumPoolSize锰悼,如果三者都滿了柳骄,使用handler處理被拒絕的任務(wù)。??
當(dāng)線程池中的線程數(shù)量大于?corePoolSize時(shí)箕般,如果某線程空閑時(shí)間超過keepAliveTime耐薯,線程將被終止。這樣丝里,線程池可以動(dòng)態(tài)的調(diào)整池中的線程數(shù)曲初。
4種拒絕策略中的兩種:
策略1:ThreadPoolExecutor.AbortPolicy()
拋出java.util.concurrent.RejectedExecutionException異常
策略2:ThreadPoolExecutor.CallerRunsPolicy
用于被拒絕任務(wù)的處理程序,它直接在?execute?方法的調(diào)用線程中運(yùn)行被拒絕的任務(wù)杯聚;如果執(zhí)行程序已關(guān)閉臼婆,則會(huì)丟棄該任務(wù)(其實(shí)就是在主線程未關(guān)閉的情況下執(zhí)行該任務(wù))
策略3:ThreadPoolExecutor.DiscardOldestPolicy()?拋棄舊的任務(wù)?
策略4:ThreadPoolExecutor.DiscardPolicy()?拋棄當(dāng)前的任務(wù)?
http://www.reibang.com/p/0e2552c30833 Optional java8新特性