線程池
線程池,一般在使用中是用Executors的靜態(tài)方法來(lái)新建出來(lái)的。比如new FixxedThreadPool new CachedThreadPool new SingleThreadPool ,這三個(gè)是比較常用的情景,但當(dāng)有限特殊情況下需要自己定義自己業(yè)務(wù)場(chǎng)景的線程池來(lái)使用。我們先來(lái)看在JDK1.5版本中ThreadPoolExecutor這個(gè)類;因?yàn)榍罢呷N新建線程池的方法其實(shí)都是這里衍生出來(lái)的
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), defaultHandler);
}```
參數(shù)介紹:
corePoolSize 核心線程數(shù),指保留的線程池大小(不超過(guò)maximumPoolSize值時(shí),線程池中最多有corePoolSize 個(gè)線程工作)。
maximumPoolSize 指的是線程池的最大大?。ň€程池中最大有corePoolSize 個(gè)線程可運(yùn)行)。
keepAliveTime 指的是空閑線程結(jié)束的超時(shí)時(shí)間(當(dāng)一個(gè)線程不工作時(shí),過(guò)keepAliveTime 長(zhǎng)時(shí)間將停止該線程)。
unit 是一個(gè)枚舉,表示 keepAliveTime 的單位(有NANOSECONDS, MICROSECONDS, MILLISECONDS, SECONDS, MINUTES, HOURS, DAYS,7個(gè)可選值)。
workQueue 表示存放任務(wù)的隊(duì)列(存放需要被線程池執(zhí)行的線程隊(duì)列)。
handler 拒絕策略(添加任務(wù)失敗后如何處理該任務(wù)).
Executors.defaultThreadFactory():默認(rèn)線程工廠
defaultHandler: 默認(rèn)的策略 拒絕
`
實(shí)際執(zhí)行流程
1、在任務(wù)數(shù)小于corepoolsize時(shí),來(lái)任務(wù)就新建一個(gè)線程來(lái)跑任務(wù)
2、線程數(shù)為corepoolsize時(shí),任務(wù)數(shù)量超過(guò)corepoolsize時(shí),任務(wù)會(huì)到workQueue阻塞隊(duì)列中
3、當(dāng)阻塞隊(duì)列放不下了,當(dāng)maxmumpoolsize大于corePoolSize時(shí)候,會(huì)啟用線程來(lái)跑隊(duì)列中的任務(wù)
4、當(dāng)儲(chǔ)備線程 和 隊(duì)列中都滿的時(shí)候,這個(gè)ThreadPoolExecutor實(shí)在沒(méi)能力處理線程了,就會(huì)執(zhí)行拒絕策略,實(shí)在吃不下了,拋rejectedException異常吧。