springboot使用執行緒池(ThreadPoolTaskExecutor)

雲深小麥發表於2021-12-23

程式碼倉庫: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(核心執行緒數量)

image
結果:執行緒池的核心執行緒數量輪訓執行

執行緒池測試2(當核心執行緒數量和最大執行緒數量不夠時)

隨機睡眠0-10000毫秒
new Random().nextInt(10000)
image

結果:
當5個核心執行緒數量不夠用時,使用最大執行緒數量裡的執行緒
當最大執行緒數量不夠用時,使用主執行緒執行該任務

// 執行緒不夠用時由呼叫的執行緒處理該任務
taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());

相關文章