spring boot自定义Async线程池
程序员文章站
2022-05-02 12:05:42
...
在spring boot项目中,会用到@Async注解来实现异步处理,该注解默认使用了SimpleAsyncTaskExecutor
线程池,但是该线程池不会重用线程,而是每次创建一个新的线程,所以可以自己定义一个可重用线程的线程池。
自定义线程池
package com.album.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.ThreadPoolExecutor;
/**
* 线程池
* @author:JZ
* @date:2019/12/21
*/
@Configuration
@EnableAsync
public class SyncConfiguration {
@Bean(name = "scorePoolTaskExecutor")
public ThreadPoolTaskExecutor getScorePoolTaskExecutor() {
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
//核心线程数
taskExecutor.setCorePoolSize(10);
//线程池维护线程的最大数量,只有在缓冲队列满了之后才会申请超过核心线程数的线程
taskExecutor.setMaxPoolSize(100);
//缓存队列
taskExecutor.setQueueCapacity(50);
//允许的空闲时间,当超过了核心线程数之外的线程在空闲时间到达之后会被销毁
taskExecutor.setKeepAliveSeconds(200);
//异步方法内部线程名称
taskExecutor.setThreadNamePrefix("score-");
/**
* 当线程池的任务缓存队列已满并且线程池中的线程数目达到maximumPoolSize,如果还有任务到来就会采取任务拒绝策略
* 通常有以下四种策略:
* ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。
* ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。
* ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
* ThreadPoolExecutor.CallerRunsPolicy:重试添加当前的任务,自动重复调用 execute() 方法,直到成功
*/
taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
taskExecutor.initialize();
return taskExecutor;
}
}
使用
定义完线程池后,只需在使用@Async注解时,将上边定义的bean名写进去即可
@Async("scorePoolTaskExecutor")
推荐阅读
-
spring boot使用自定义的线程池执行Async任务
-
深入理解spring boot异步调用方式@Async
-
Spring-Boot使用嵌入式容器,那怎么配置自定义Filter呢
-
Python探索之自定义实现线程池
-
spring-boot-2.0.3不一样系列之番外篇 - 自定义session管理,绝对有值得你看的地方
-
Spring boot 学习笔记 1 - 自定义错误
-
IDEA开发spring boot应用时 application.yml 或 application.properties 自定义属性提示
-
浅谈Spring Boot 属性配置和自定义属性配置
-
Spring boot中自定义Json参数解析器
-
自定义简单版本python线程池