springboot学习笔记 线程池的使用和自定义配置
2020-12-02 本文已影响0人
冰花水焰
springboot默认线程池简单实现
1.使用方法在spring boot的启动类上加上@EnableAsync注解,表示项目支持异步方法调用
2.在需要异步调用的方法上添加@Async注解,表示该方法为异步方法,即该方法和调用者不在一个线程中进行如果需要返回值
1、判断核心线程池是否已满,如果不是,则创建线程执行任务
2、如果核心线程池满了,判断队列是否满了,如果队列没满,将任务放在队列中
3、如果队列满了,则判断线程池是否已满,如果没满,创建线程执行任务
4、如果线程池也满了,则按照拒绝策略对任务进行处理
对于spring框架中线程池配置参数的涵义,可以参考ThreadPoolExecutor对象中的解释。
说明:对于@Async注解默认会基于ThreadPoolTaskExecutor对象获取工作线程,然后调用由@Async描述的方法,让方法运行于一个工作线程,以实现异步操作。但是假如系统中的默认拒绝处理策略,任务执行过程的异常处理不能满足我们自身业务需求的话,我可以对异步线程池进行自定义.(SpringBoot中默认的异步配置可以参考自动配置对象TaskExecutionAutoConfiguration).
简单配置
image.png或者通过自定义配置类的方式实现
1、 核心参数介绍
1、CorePoolSize:核心线程数,核心线程会一直存活,即使没有任务
2、MaxPoolSize:线程池中的最大线程数
3、QueueCapacity:阻塞队列的容量,用来存储等待执行的任务
4、KeepAliveSeconds:线程空闲时间
5、RejectedExecutionHandler:拒绝策略
2、为了让Spring中的异步池更好的服务于我们的业务,同时也尽量避免OOM,可以自定义线程池优化设计如下:关键代码如下:
@Slf4j
@Setter
@Configuration
@ConfigurationProperties("async-thread-pool")
public class SpringAsyncConfig implements AsyncConfigurer{
/**核心线程数*/
private int corePoolSize=20;
/**最大线程数*/
private int maximumPoolSize=1000;
/**线程空闲时间*/
private int keepAliveTime=30;
/**阻塞队列容量*/
private int queueCapacity=200;
/**构建线程工厂*/
private ThreadFactory threadFactory=new ThreadFactory() {
//CAS算法
private AtomicInteger at=new AtomicInteger(1000);
@Override
public Thread newThread(Runnable r) {
return new Thread(r,
"async-thread-"+at.getAndIncrement());
}
};
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(corePoolSize);
executor.setMaxPoolSize(maximumPoolSize);
executor.setKeepAliveSeconds(keepAliveTime);
executor.setQueueCapacity(queueCapacity);
executor.setRejectedExecutionHandler((Runnable r,
ThreadPoolExecutor exe) -> {
log.warn("当前任务线程池队列已满.");
});
executor.initialize();
return executor;
}
@Override
public AsyncUncaughtExceptionHandler
getAsyncUncaughtExceptionHandler() {
return new AsyncUncaughtExceptionHandler() {
@Override
public void handleUncaughtException(Throwable ex ,
Method method , Object... params) {
log.error("线程池执行任务发生未知异常.", ex);
}
};
}}
其中:@ConfigurationProperties("async-thread-pool")的含义是读取application.yml配置文件中以"async-thread-pool"名为前缀的配置信息,并通过所描述类的set方法赋值给对应的属性,在application.yml中连接器池的关键配置如下:
async-thread-pool:
corePoolSize: 20
maxPoolSize: 1000
keepAliveSeconds: 30
queueCapacity: 1000
后续在业务类中,假如我们使用@Async注解描述业务方法,默认会使用ThreadPoolTaskExecutor池对象中的线程执行异步任务