代碼倉庫:gitee
線程池創建
@Configuration
@EnableAsync
public class TaskPoolConfig {
@Bean("syncExecutorPool")
public Executor taskExecutor() {
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
// 核心池大小
taskExecutor.setCorePoolSize(5);
// 最大線程數
taskExecutor.setMaxPoolSize(10);
// 隊列程度
taskExecutor.setQueueCapacity(100);
// 線程空閑時間
taskExecutor.setKeepAliveSeconds(60);
// 線程前綴名稱
taskExecutor.setThreadNamePrefix("syncExecutor--");
// 該方法用來設置 線程池關閉 的時候 等待 所有任務都完成后,再繼續 銷毀 其他的 Bean,
// 這樣這些 異步任務 的 銷毀 就會先於 數據庫連接池對象 的銷毀。
taskExecutor.setWaitForTasksToCompleteOnShutdown(true);
// 任務的等待時間 如果超過這個時間還沒有銷毀就 強制銷毀,以確保應用最后能夠被關閉,而不是阻塞住。
taskExecutor.setAwaitTerminationSeconds(60);
// 線程不夠用時由調用的線程處理該任務
taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
return taskExecutor;
}
}
線程池參數
核心線程數量:CorePoolSize
看業務場景設置(我通常設置為CPU核心*1)
最大線程數量:MaxPoolSize
當核心線程數量都在使用狀態時,會調用最大線程數量里的線程,使用的總線程不會超過最大線程數量,其余則等待(我通常設置為CPU核心*2)
隊列程度:QueueCapacity
線程隊列的大小
線程空閑時間:KeepAliveSeconds
線程前綴名稱:ThreadNamePrefix
停機策略:WaitForTasksToCompleteOnShutdown
該方法用來設置 線程池關閉 的時候 等待 所有任務都完成后,再繼續 銷毀 其他的 Bean,這樣這些 異步任務 的 銷毀 就會先於 數據庫連接池對象 的銷毀。
任務的等待時間:AwaitTerminationSeconds
任務的等待時間 如果超過這個時間還沒有銷毀就 強制銷毀,以確保應用最后能夠被關閉,而不是阻塞住
拒接策略:RejectedExecutionHandler
線程不夠用時由調用的線程處理該任務
線程池測試1(核心線程數量)
結果:線程池的核心線程數量輪訓執行
線程池測試2(當核心線程數量和最大線程數量不夠時)
隨機睡眠0-10000毫秒
new Random().nextInt(10000)
結果:
當5個核心線程數量不夠用時,使用最大線程數量里的線程
當最大線程數量不夠用時,使用主線程執行該任務
// 線程不夠用時由調用的線程處理該任務
taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());