線程池中的七大參數如下:
(1)corePoolSize:線程池中的常駐核心線程數。
(2)maximumPoolSize:線程池能夠容納同時執行的最大線程數,此值大於等於1。
(3)keepAliveTime:多余的空閑線程存活時間,當空間時間達到keepAliveTime值時,多余的線程會被銷毀直到只剩下corePoolSize個線程為止。
(4)unit:keepAliveTime的單位。
(5)workQueue:任務隊列,被提交但尚未被執行的任務。
(6)threadFactory:表示生成線程池中工作線程的線程工廠,用戶創建新線程,一般用默認即可。
(7)handler:拒絕策略,表示當線程隊列滿了並且工作線程大於等於線程池的最大顯示數(maxnumPoolSize)時如何來拒絕請求執行的runnable的策略。
流程分析
- 線程池中線程數小於corePoolSize時,新任務將創建一個新線程執行任務,不論此時線程池中存在空閑線程;
- 線程池中線程數達到corePoolSize時,新任務將被放入workQueue中,等待線程池中任務調度執行;
- 當workQueue已滿,且maximumPoolSize>corePoolSize時,新任務會創建新線程執行任務;
- 當workQueue已滿,且提交任務數超過maximumPoolSize,任務由RejectedExecutionHandler處理;
- 當線程池中線程數超過corePoolSize,且超過這部分的空閑時間達到keepAliveTime時,回收該線程;
- 如果設置allowCoreThreadTimeOut(true)時,線程池中corePoolSize范圍內的線程空閑時間達到keepAliveTime也將回收;
一:corePoolSize 詳細描述
(1)在創建了線程池后,當有請求任務來之后,就會安排池中的線程去執行請求任務,近視理解為今日當值線程。
(2)當線程池中的線程數目達到corePoolSize后,就會把到達的任務放入到緩存隊列當中。
二:最大線程數(maximumPoolSize):該參數定義了一個線程池中最多能容納多少個線程。當一個任務提交到線程池中時,如果線程數量達到了核心線程數,並且任務隊列已滿,不能再向任務隊列中添加任務時,這時會檢查任務是否達到了最大線程數,如果未達到,則創建新線程,執行任務,否則,執行拒絕策略。可以通過源碼來看一下。如下:可以看出,當調用submit(Runnable task)方法,將任務提交到線程池中時,會調用execute()方法去執行任務,在該方法內,會進行核心線程數,任務隊列的判斷,最后決定是執行或者是拒絕。總結起來就是:最大線程數參數,是在已經達到核心線程池參數,並且任務隊列已經滿的情況下,才去判斷該參數。
三:keepAliveTime 詳細描述
只有當線程池中的線程數大於corePoolSize時keepAliveTime才會起作用,直到線程中的線程數不大於corepoolSIze。
四:系統默認的拒絕策略有以下幾種:
- AbortPolicy:為線程池默認的拒絕策略,該策略直接拋異常處理。
- DiscardPolicy:直接拋棄不處理。
- DiscardOldestPolicy:丟棄隊列中最老的任務。
- CallerRunsPolicy:將任務分配給當前執行execute方法線程來處理。