线程池中的两个概念:线程和任务,任务是需要线程去执行的。
这里写一个支付相关的异步线程池的栗子:
1、在
application.properties中添加线程池的配置参数:
# 支付相关的配置
pay.threadNamePrefix=pay-exec-
pay.maxPoolSize=20
pay.corePoolSize=10
pay.queueCapacity=1000
2、基于注解进行参数的配置
在
config包下,创建
PayThreadPoolConfig.java配置类:
/**
* 配置支付线程池
*/
@EnableAsync
@Configuration
public class PayThreadPoolsConfig {
/**
* 支付线程相关参数
*/
@Value("${pay.threadNamePrefix}")
private String threadNamePrefix; // 配置线程池中的线程名称前缀
@Value("${pay.corePoolSize}")
private Integer corePoolSize; // 配置线程池中的核心线程数
@Value("${pay.maxPoolSize}")
private Integer maxPoolSize; // 配置最大线程数
@Value("${pay.queueCapacity}")
private Integer queueCapacity; // 配置队列大小
/**
* 支付线程池配置
* @return
*/
@Bean
public AsyncTaskExecutor paymentTaskExexutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setThreadNamePrefix(threadNamePrefix);
executor.setCorePoolSize(corePoolSize);
executor.setMaxPoolSize(maxPoolSize);
executor.setQueueCapacity(queueCapacity);
// 设
executor.setRejectedExecutionHandler(new RejectedExecutionHandler() {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
// TODO
}
});
return executor;
}
}
分析:
问题1:上述的核心线程数corePoolSize、最大线程数maxPoolSize以及队列大小queueCapacity,该如何设置?
corePoolSize:核心线程数。
1)核心线程会一直存活,即使没有任务需要执行。
2)当线程数小于核心线程时,即使有线程空闲,线程池也会优先创建新线程处理。
3)设置allowCoreThreadTimeOut=true(默认为false)时,核心线程会超时关闭。
4)当所有核心线程都忙碌时,此时如果系统需要新的线程执行别的任务,线程池不会创建新的线程,而是把任务放入任务队列(与queueCapacity相关)
queueCapacity:任务队列的容量(