# @Async如何使用

# Spring配置启动异步调用

通过注解@EnableAsync让Spring支持异步调用。

# 如何自定义线程调用的线程池

如果不自定义线程池,则Spring会使用默认的线程池。

自定义线程池代码如下:

  //在component中添加如下方法
  @Bean
  public AsyncTaskExecutor taskExecutor() { 
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); 
    executor.setThreadNamePrefix("Anno-Executor");
    executor.setCorePoolSize(5);
    executor.setMaxPoolSize(20);
    executor.setQueueCapacity(100);
    executor.setKeepAliveSeconds(30);
 
    // 设置拒绝策略
    executor.setRejectedExecutionHandler(new RejectedExecutionHandler() {
      @Override
      public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
        // .....
      }
    });
    // 
    // executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
 
    return executor; 
  } 

# @Async支持的方法签名

  1. 入参可自定义,可有可无。
  2. 返回参只能是void,或者是Future<?>

# 异步调用对于异常的处理

  1. 返回值是void,异常会被AsyncUncaughtExceptionHandler处理掉。
  2. 返回值是Future<?>,如下两种处理异常的方式
    1. 在异步逻辑中处理,通过Future<?>返回。
    2. 在future.get()处进行捕获。
修改于: 8/11/2022, 3:17:56 PM