线程池是一种利用池化技术思想来实现的线程管理技术,主要是为了复用线程、便利地管理线程和任务、并将线程的创建和任务的执行解耦开来。我们可以创建线程池来复用已经创建的线程来降低频繁创建和销毁线程所带来的资源消耗。
使用方式:
1、启动类需要添加@EnableAsync注解,否则会失效
2、方法上添加@Async("threadPoolTaskExecutor")注解实现异步操作(常见失效原因:不是public方法、返回不是void或者Future、使用static修饰)
3、个人建议不要使用SpringBoot默认线程池,可能会造成OOM
代码实现方式:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.ThreadPoolExecutor;
/**
* 创建线程池
* @date 2023/10/16 17:02
* @author luohao
*/
@Configuration
public class ThreadPoolConfig {
// 核心线程池大小
private int corePoolSize = 50;
// 最大可创建的线程数
private int maxPoolSize = 200;
// 队列最大长度
private int queueCapacity = 1000;
// 线程池维护线程所允许的空闲时间
private int keepAliveSeconds = 300;
@Bean(name = "threadPoolTaskExecutor")
public ThreadPoolTaskExecutor threadPoolTaskExecutor()
{
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//核心线数
executor.setCorePoolSize(corePoolSize);
//最大线程数
executor.setMaxPoolSize(maxPoolSize);
//队列数
executor.setQueueCapacity(queueCapacity);
//线程空闲时间
executor.setKeepAliveSeconds(keepAliveSeconds);
//指定用于新创建的线程名称的前缀
executor.setThreadNamePrefix("threadPoolTaskExecutor-");
/**
* 拒绝策略
* ThreadPoolExecutor.AbortPolicy 默认拒绝策略,丢弃任务并抛出RejectedExecutionException异常
* ThreadPoolExecutor.DiscardPolicy 直接丢弃任务,但不抛出异常
* ThreadPoolExecutor.DiscardOldestPolicy 丢弃任务队列最先加入的任务,再执行execute方法把新任务加入队列执行
* ThreadPoolExecutor.CallerRunsPolicy:由创建了线程池的线程来执行被拒绝的任务
*/
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
return executor;
}
}