劇情回顧:
上節(jié)主要講了為什么要使用線程池,線程池的類型平窘,線程池的類結(jié)構(gòu)圖吓肋。
本節(jié)主講內(nèi)容如下:
1 線程池ThreadPoolExecutor參數(shù)含義
首先了解一下ThreadPoolExecutor參數(shù)組成
int corePoolSize, //核心線程數(shù)量
int maximumPoolSize, //最大線程數(shù)量
long keepAliveTime, //存活時(shí)間
TimeUnit unit, //指明存活時(shí)間使用的單位
BlockingQueue<Runnable> workQueue, //阻塞隊(duì)列
ThreadFactory threadFactory, //產(chǎn)生線程的工廠類 RejectedExecutionHandler handler //拒絕策略
corePoolSize就是我們配置的線程池中可以使用線程的數(shù)量,
maximumPoolSize是最大線程的數(shù)量瑰艘,當(dāng)阻塞隊(duì)列已滿的時(shí)候會(huì)判斷是否超過(guò)最大線程數(shù)量
workQueue阻塞隊(duì)列是鬼,當(dāng)線程池中的線程的數(shù)量超過(guò)corePoolSize的數(shù)量的時(shí)候,就會(huì)將創(chuàng)建的新的線程加入到阻塞隊(duì)列紫新,這個(gè)阻塞隊(duì)列默認(rèn)的情況下是LinkedBlockingQueue有界隊(duì)列均蜜,上界為int最大值,Cachethreadpool 用的不是LinkedBlockingQueue芒率,而是synchronousblockingqueue
ThreadFactory這個(gè)就是一個(gè)線程的產(chǎn)生工廠無(wú)需多講囤耳,
主要看一下RejectedExecutionHandler,這個(gè)就是所謂的拒絕策略偶芍,為什么又會(huì)這個(gè)呢充择?也就是阻塞隊(duì)列滿了的時(shí)候需要有個(gè)拒絕的策略,默認(rèn)情況下是AbortPolicy拋出異常匪蟀,還有其他的幾種CallerRunsPolicy聪铺,DiscardPolicy,DiscardOldestPolicy分別的含義為:
CallerRunsPolicy:這個(gè)拒絕策略的做法是會(huì)暫停當(dāng)前線程池中運(yùn)行的任務(wù)萄窜,直接運(yùn)行當(dāng)前新建的任務(wù)铃剔。
DiscardPolicy:對(duì)新建的任務(wù)什么也不做直接丟棄撒桨,不會(huì)影響現(xiàn)在的線程池。
DiscardOldestPolicy:會(huì)將當(dāng)前線程池阻塞隊(duì)列對(duì)尾任務(wù)丟棄键兜,然后將新建的任務(wù)加入隊(duì)列
線程池處理流程圖:
2 線程池ThreadPoolExecutor類的組成成分
主要包含了一個(gè)work,每一個(gè)work其實(shí)就是一個(gè)線程凤类,并且work還extends AbstractQueuedSynchronizer因此有了鎖的功能,所謂的線程池就是一個(gè)一個(gè)的work構(gòu)成的一個(gè)hashset集合普气,還有 ReentrantLock mainLock 主要起到加鎖的作用谜疤。
基本參數(shù)和組成部分就這些了。