Springboot線程池配置管理

Springboot線程池配置管理

1. 線程池配置類

package com.bin.kong.csdnspider.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.task.AsyncTaskExecutor;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.ThreadPoolExecutor;
@Configuration
@EnableAsync
public class ThreadPoolConfig {
    private int corePoolSize = 10;//線程池維護線程的最少數量
    private int maxPoolSize = 50;//線程池維護線程的最大數量
    private int queueCapacity = 20; //緩存隊列
    private int keepAlive = 120;//允許的空閒時間
    @Bean
    public AsyncTaskExecutor threadExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(corePoolSize);
        executor.setMaxPoolSize(maxPoolSize);
        executor.setQueueCapacity(queueCapacity);
        executor.setThreadNamePrefix("threadExecutor-");
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); //對拒絕task的處理策略
        executor.setKeepAliveSeconds(keepAlive);
        executor.initialize();
        return executor;
    }
}

配置說明:

配置項 說明
corePoolSize 最小的線程數,缺省:1
maxPoolSize 最大的線程數,缺省:Integer.MAX_VALUE
queueCapacity 當線程池中最小的線程數被佔用滿後,新的任務會被放進隊列queue裏面,當這個queue的capacity也被佔滿之後,pool裏面會創建新線程處理這個任務,直到總線程數達到了最大線程數maxsize,這時系統會拒絕這個任務並拋出TaskRejectedException異常(缺省配置的情況下,可以通過rejection-policy來決定如何處理這種情況)。缺省值爲:Integer.MAX_VALUE
keepAlive 超過corePoolSize最小線程數的那些線程,任務完成後,再經過這個設置的時長(單位:秒)會被結束掉,這樣的話線程池可以動態的調整池中的線程數
rejection-policy ABORT(缺省):拋出TaskRejectedException異常,然後不執行;DISCARD:不執行,也不拋出異常即放棄該線程;DISCARD_OLDEST:丟棄queue中最舊的那個任務;CALLER_RUNS:不在新線程中執行任務,而是由調用者所在的線程來執行(不再異步)

2.線程池的使用

在類中的方法名上使用:@Async(“threadExecutor”) 即可達到使用線程池的效果
示例如下:

package com.bin.kong.csdnspider.utils;
import org.springframework.scheduling.annotation.Async;
@Service
public class TestThreadPool {
    @Async("threadExecutor")
    public void exec() {
        System.out.println("當前線程名:"+Thread.currentThread().getName());
    }
}

測試打印結果如下:

當前線程名:threadExecutor-1

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章