介绍
spring提供了线程池,只需要加@Autowired就可以使用
该线程池的默认线程数量为设备的CPU核心数,8核则8线程,16核则16线程,可以通过配置更改。
现在controller或service层定义 线程池,spring会自动注入bean
/** spring 提供的线程池 */
@Autowired
private ThreadPoolTaskExecutor poolTaskExecutor;
调用线程池执行任务
poolTaskExecutor.execute(() -> {
try {
// 业务逻辑
} catch (Exception e) {
log.error("spring线程池执行异常", e);
}
});
创建线程池
最近发现有时在项目中直接使用线程池会报出找不到bean的问题,可能是spring boot版本不同,导致没有自带线程池,此时需要在spring配置类里加入以下的bean
/**
* 创建线程池
*/
@Bean
public ThreadPoolTaskExecutor threadPoolTaskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
// 获取可用处理器的Java虚拟机的数量(未必能准确获取到CPU核心数量)
int core = Runtime.getRuntime().availableProcessors();
log.info("正在创建线程池ThreadPoolTaskExecutor,线程池核心数量:" + core);
// 核心线程数
executor.setCorePoolSize(core);
// 最大线程数
executor.setMaxPoolSize(core * 2 + 1);
// 除核心线程外的线程存活时间
executor.setKeepAliveSeconds(10);
// 等待队列数量
executor.setQueueCapacity(50);
// 设置线程前缀名称
executor.setThreadNamePrefix("ThreadExecutor-");
// 设置拒绝策略(线程不够用时由调用的线程处理该任务)
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
// 停机策略:该方法用来设置 线程池关闭 的时候 等待 所有任务都完成后,再继续 销毁 其他的 Bean,
// 这样这些 异步任务 的 销毁 就会先于 数据库连接池对象 的销毁。
executor.setWaitForTasksToCompleteOnShutdown(true);
// 任务的等待时间 如果超过这个时间还没有销毁就 强制销毁,以确保应用最后能够被关闭,而不是阻塞住。
executor.setAwaitTerminationSeconds(60);
return executor;
}