Java開發的同學肯定使用過多線程,使用多線程那就肯定會用到線程池。而且個人認爲線程池也是各大互聯網公司在面試的時候比問的一個知識點。因此作爲開發人員,必須瞭解線程池的原理以及具體參數的含義。
首先我們來了解下線程池的基本原理
- 第一步便是我們將我們的任務提交給線程池
- 如果線程池中有足夠的線程或者線程數小於核心線程數,則直接執行任務或者創建一個新的線程來執行該任務。否則進入步驟3
- 提交任務時,線程池中的空閒的線程數爲0並且線程數等於核心線程數,則觀察線程池中的任務隊列是否已滿,如果未滿則將任務添加到任務隊列,否則進入步驟4
- 當任務隊列已滿時,就執行拒絕策略(後續詳解拒絕策略)
在大致瞭解了線程池的基本工作原理之後,我們再細看下線程池核心類ThreadPoolExecutor
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {
//省略具體的代碼內容
}
參數說明
參數 | 說明 |
---|---|
corePoolSize | 核心線程數 |
maximumPoolSize | 最大線程數,一般大於等於核心線程數 |
keepAliveTime | 線程存活時間(針對最大線程數大於核心線程數時,非核心線程) |
unit | 存活時間單位,和線程存活時間配套使用 |
workQueue | 任務隊列 |
threadFactory | 創建線程的工程 |
handler | 拒絕策略 |
拒絕策略有以下幾種
拒絕策略 | 說明 |
---|---|
AbortPolicy | 爲java線程池默認的阻塞策略,不執行此任務,而且直接拋出一個運行時異常。 |
DiscardOldestPolicy | 丟棄隊列最前面的任務,然後重新嘗試執行任務(重複此過程) |
DiscardPolicy | 也是丟棄任務,但是不拋出異常 |
CallerRunsPolicy | 由調度線程處理該任務 |