package com.config;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.ThreadPoolExecutor;
/**
* 线程池配置
*
*/
@Slf4j
@Configuration
@EnableAsync
public class ThreadConfigurer implements AsyncConfigurer {
/**
* taskExecutor
*
* @return ThreadPoolTaskExecutor
*/
@Primary
@Bean
public ThreadPoolTaskExecutor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//获取电脑的处理器数量,一般电脑一个处理器有两个逻辑线程
int num = Runtime.getRuntime().availableProcessors();
// 核心线程数目 核心线程数最好设置为电脑的逻辑线程总数 + 1,达到最大化利用处理器
executor.setCorePoolSize(num * 2 + 1);
// 指定最大线程数
executor.setMaxPoolSize(200);
// 队列中最大的数目
executor.setQueueCapacity(100);
// 线程名称前缀
executor.setThreadNamePrefix("taskExecutor-");
// 拒绝策略:不在新线程中执行任务,而是由调用者所在的线程来执行
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
// 当调度器shutdown被调用时等待当前被调度的任务完成
executor.setWaitForTasksToCompleteOnShutdown(true);
// 线程空闲后的最大存活时间
executor.setKeepAliveSeconds(60);
// 线程池初始化
executor.initialize();
return executor;
}
}
【业务功能篇42】ThreadPoolTaskExecutor多线程处理耗时较高的数据接口-CSDN博客
Spring容器中的ThreadPoolTaskExecutor是否需要手动关闭_threadpoolexecutor需要手动关闭吗-CSDN博客
多线程系列:二、线程池在 Spring 中的使用与关闭_springbatch split 线程池-CSDN博客
多线程系列:附、LinkedBlockingQueue 引发的一次线上事故_linkedblockingqueue thread乱了-CSDN博客