一、配置
(1)配置文件
在application中或者nacos中配置线程池参数,如下:
#线程池配置
task:
pool:
corePoolSize: 100
maxPoolSize: 200
keepAliveSeconds: 300
queueCapacity: 50
(2)配置文件数据映射
/**
* 线程池配置属性类
*/
@Data
@Component
@ConfigurationProperties(prefix = "task.pool")
public class TaskThreadPoolConfig {
/**
* 核心线程数
*/
private int corePoolSize;
/**
* 最大线程数
*/
private int maxPoolSize;
/**
* 线程空闲时间
*/
private int keepAliveSeconds;
/**
* 任务队列容量(阻塞队列)
*/
private int queueCapacity;
}
(3)config
/**
* 重写默认线程池配置
* @author YuXD
*/
@Slf4j
@Configuration
@EnableAsync
public class OverrideDefaultThreadPoolConfig implements AsyncConfigurer {
@Autowired
private TaskThreadPoolConfig taskThreadPoolConfig;
@Override
@Bean("taskExecutor")
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//核心线程池大小
executor.setCorePoolSize(taskThreadPoolConfig.getCorePoolSize());
//最大线程数
executor.setMaxPoolSize(taskThreadPoolConfig.getMaxPoolSize());
//队列容量
executor.setQueueCapacity(taskThreadPoolConfig.getQueueCapacity());
//活跃时间
executor.setKeepAliveSeconds(taskThreadPoolConfig.getKeepAliveSeconds());
//线程名字前缀
executor.setThreadNamePrefix("default-thread-");
/*
当poolSize已达到maxPoolSize,如何处理新任务(是拒绝还是交由其它线程处理)
CallerRunsPolicy:不在新线程中执行任务,而是由调用者所在的线程来执行
*/
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.initialize();
return executor;
}
/**
* 异步任务中异常处理
*
* @return
*/
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return (ex, method, params) -> {
log.error("==========================" + ex.getMessage() + "=======================", ex);
log.error("exception method:" + method.getName());
};
}
}
二、使用
@Slf4j
@Service
@AllArgsConstructor
public class DemoExecuteTask {
/**
* 线程池执行方法
*/
@Async("taskExecutor")
public void testExecute() {
//业务方法编写
}
}