Java面试题更新 2026-08-05

在 Spring Boot 应用中,有哪些方式可以开启并执行异步任务,请说明主要步骤和注意事项?

后端开发技术原理问题排查JavaSpring BootSpring Framework

考察说明

考察对 Spring Boot 异步编程模型的理解与落地能力

回答思路

  1. 【回答框架 1】Spring Boot 通过 @EnableAsync 开启异步支持,配合 @Async 注解标记异步方法,实现基于代理的异步执行。需在配置类或启动类添加 @EnableAsync。
  2. 【回答框架 2】异步方法默认使用 SimpleAsyncTaskExecutor,每次新建线程,建议自定义 ThreadPoolTaskExecutor 作为线程池,设置核心线程数、最大线程数、队列容量和拒绝策略,避免资源耗尽。
  3. 【回答框架 3】可通过实现 AsyncConfigurer 接口或定义 TaskExecutor Bean 来定制线程池,并通过 @Async("beanName") 指定使用特定执行器。异步方法需通过 Spring 代理调用,直接同类内部调用会失效,注意自调用问题。
  4. 【回答框架 4】异常处理方面,可配置 AsyncUncaughtExceptionHandler 捕获无返回值异步方法的异常;有返回值时使用 Future 或 CompletableFuture 处理结果和异常。
  5. 【回答框架 5】注意事项包括:异步方法不能是 private,且需被 Spring 管理;事务管理在异步方法中不自动生效,需单独处理;上下文传递如 SecurityContext 需要显式传播。
  6. 【关键点 1】@EnableAsync 开启异步,@Async 标记方法即异步执行
  7. 【关键点 2】默认线程池为 SimpleAsyncTaskExecutor,生产环境应自定义 ThreadPoolTaskExecutor
  8. 【关键点 3】同类内部调用或非 Spring 代理调用会使 @Async 失效
  9. 【关键点 4】异步异常需通过 AsyncUncaughtExceptionHandler 或 Future 处理
  10. 【关键点 5】异步方法中的事务和上下文传播需额外处理
  11. 【易错点 1】盲目使用默认线程池,在高并发下可能创建大量线程导致 OOM,需合理配置线程池参数
  12. 【易错点 2】将 @Async 用在 private 方法或自调用场景,导致异步不生效,且无报错提示
  13. 【易错点 3】忽略异步方法的异常处理,异常被吞掉无日志,难以排查问题