Spring Boot: 线程池
使用Spring Boot 线程池需要在主方法
或者controller类
上加上@EnableAsync
注解,开启异步执行
ThreadPoolTaskExecutor, 多线程
@Async
@Async
注解会将任务提交到ThreadPoolTaskExecutor
线程池中执行- value 指定使用哪个线程池
config文件中配置
executor.setCorePoolSize(16); //配置核心线程数
executor.setMaxPoolSize(64); //配置最大线程数
executor.setQueueCapacity(9999); //配置队列大小
executor.setThreadNamePrefix("async-order-");
//配置线程池中的线程的名称前缀 (指定一下线程名的前缀)
// rejection-policy:当pool已经达到max pool size的时候,如何处理新任务
// CALLER_RUNS:不在新线程中执行任务,而是由调用线程(提交任务的线程)处理该任务
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
//拒绝策略:
/*1.DiscardOldestPolicy 超出线程池直接丢弃比较老的线程
2.AbortPolicy 超出大小抛出异常
3.CallerRunsPolicy 直接在当前线程中运行此任务,不拒绝
4.DiscardPolicy 超多线程池大小直接丢弃
他们都实现了RejectedExecutionHandler接口
拒绝策略通常是自定义实现的
*/
executor.initialize();//执行初始化
application属性配合文件中配置
修改线程池默认参数
spring.task.execution.pool.max-size=99999
#配置最大线程数
spring.task.execution.thread-name-prefix=pay-task-
#线程池前缀名称
spring.task.execution.pool.queue-capacity=99999
#配置队列大小
不用 @Async注解,我们手动利用线程池编程异步处理
@Autowired
private ThreadPoolTaskExecutor applicationTaskExecutor;
//将applicationTaskExecutor自动注入到spring容器中
for (int i = 0; i < 1000; i++) {
//并发处理
Future<String> future = applicationTaskExecutor.submit(() -> {
String result = SMS.sendSMS("线程池执行");
return result;
});
futures.add(future);
}