java spring 异步执行 异步线程池作者:曾 彬
除了借助redis进行异步任务外,spring还提供了异步线程池自己完成异步处理任务。
Spring 提供了便捷的注解@EnableAsync,如果配置文件标注了它,那么Spring就会开启异步可用,这样就可用使用注解@Async驱动Spring使用异步调用
其实非常简单,只需要在方法上面加上@Async注解即可
@Async
public void test(){
//这里执行异步操作
}
spring 默认使用的是SimpleAsyncTaskExecutor,他默认来一个任务新建一个线程去做
protected void doExecute(Runnable task) {
Thread thread = (this.threadFactory != null ? this.threadFactory.newThread(task) : createThread(task));
thread.start();
}
当然我们也可以自定义配置,我们写一个Java的配置文件:
@Configuration
@EnableAsync
public class AsyncConfig implements AsyncConfigurer {
//定义线程池
@Override
public Excutor getAsyncExecutor() {
//定义线程池
ThreadPoolTaskExecutor taskExecutor new ThreadPoolTaskExecutor();
//核心线程数
taskExecutor.setCorePoolSize(10);
//线程池最大线程数
taskExecutor.setMaxPoolSize(30);
//线程队列最大线程数
taskExecutor.setQueueCapacity(2000);
//线程拒绝策略
taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
//初始化
taskExecutor.initialize();
return taskExecutor;
}
}
最后解释一下「核心线程数」、「最大线程数」、「线程队列最大线程数」的含义与影响
我们同过提交一个新的异步任务来看区别:
「当前运行线程数」 < 「核心线程数」 : 新增一个线程来完成
「当前运行线程数」 = 「核心线程数」 : 进入等待队列
「当前等待队列线程数」 > 「线程队列最大线程数」 且 「当前运行线程数」 < 「最大线程数」: 新增一个线程来完成
「当前等待队列线程数」 > 「线程队列最大线程数」 且 「当前运行线程数」 > 「最大线程数」: 根据饱和策略RejectedExecutionHandler拒绝新的任务