java spring 异步执行 异步线程池
作者:bin除了借助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拒绝新的任务