首页 > java线程 > java spring 异步执行 异步线程池

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拒绝新的任务

您必须 [ 登录 ] 才能发表留言!