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