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