SpringBoot中实现多线程六种方式大全
作者:AI老李
Spring Boot 提供了非常丰富的多线程支持手段,从最简单的注解到虚拟线程,可以满足从简单异步任务到高并发 IO/CPU 密集型场景的各种需求,下面列出目前(2026 年视角)最常用、最推荐的 6 种方式,需要的朋友可以参考下
Spring Boot 提供了非常丰富的多线程支持手段,从最简单的注解到虚拟线程(Java 21+ / 25+ 时代的主流方向),可以满足从简单异步任务到高并发 IO/CPU 密集型场景的各种需求。
下面列出目前(2026 年视角)最常用、最推荐的 6 种方式,并按推荐优先级排序(从最常用 → 最前沿)。
1. @Async + @EnableAsync(最常用、最简单)
核心步骤:
- 启动类或配置类加
@EnableAsync - 方法加
@Async - (可选)自定义线程池
ThreadPoolTaskExecutor
// 开启异步
@EnableAsync
@SpringBootApplication
public class Application { ... }
// 异步方法
@Service
public class MailService {
@Async
public void sendMail(String to, String content) {
// 耗时操作
log.info("发送邮件中... Thread: {}", Thread.currentThread().getName());
}
}
自定义线程池(强烈推荐):
@Configuration
public class AsyncConfig implements AsyncConfigurer {
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(8);
executor.setMaxPoolSize(16);
executor.setQueueCapacity(200);
executor.setThreadNamePrefix("async-mail-");
// 拒绝策略(很重要!)
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.initialize();
return executor;
}
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return (ex, method, params) -> log.error("异步异常", ex);
}
}
优点:零侵入、简单
缺点:无法获取返回值(需配合 CompletableFuture)
2. CompletableFuture + @Async(有返回值 + 链式编排)
适用场景:需要异步结果、任务编排、并行聚合、超时控制
@Service
public class UserService {
@Async
public CompletableFuture<User> getUserById(Long id) {
// 模拟耗时
Thread.sleep(1000);
return CompletableFuture.completedFuture(new User(id));
}
public CompletableFuture<List<User>> batchGetUsers(List<Long> ids) {
List<CompletableFuture<User>> futures = ids.stream()
.map(this::getUserById)
.toList();
return CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]))
.thenApply(v -> futures.stream().map(CompletableFuture::join).toList());
}
}
优点:强大组合能力、异常处理友好
缺点:代码稍复杂
3. ThreadPoolTaskExecutor 手动提交任务(最灵活)
适用场景:需要精细控制线程池、批量任务、自定义拒绝策略
@Autowired
private ThreadPoolTaskExecutor executor;
public void processBatch(List<Task> tasks) {
List<CompletableFuture<Void>> futures = new ArrayList<>();
for (Task task : tasks) {
CompletableFuture<Void> future = CompletableFuture.runAsync(task::execute, executor);
futures.add(future);
}
CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
}
4. Java 原生方式(Executors / Thread / Runnable / Callable)
适用场景:不依赖 Spring 容器、测试、工具类、极简场景
// 方式1:直接 new Thread(不推荐) new Thread(() -> doSomething()).start(); // 方式2:Executors 工具类 ExecutorService executor = Executors.newFixedThreadPool(10); executor.submit(() -> doSomething());
注意:生产环境强烈不建议直接用 Executors.newFixedThreadPool(),因为 OOM 风险极大(无界队列)。
5. 虚拟线程(Java 21+ / Spring Boot 3.2+ / 3.3+ 强烈推荐)
适用场景:高并发 IO 密集型场景(接口调用、文件读写、数据库查询等)
开启方式(Spring Boot 3.2+):
# application.yml
spring:
threads:
virtual:
enabled: true
或代码方式:
@Bean
public TaskExecutor taskExecutor() {
return Executors.newVirtualThreadPerTaskExecutor();
}
@Async 也会自动使用虚拟线程(当启用后)
优点:线程创建成本极低、可创建数十万线程、极大提升吞吐量
缺点:CPU 密集型任务不适合(仍建议用固定线程池)
6. Spring 定时任务 + 多线程(@Scheduled + 线程池)
适用场景:定时批量处理、爬虫、清理任务
@Configuration
@EnableScheduling
@EnableAsync
public class ScheduleConfig {
@Scheduled(cron = "0 */5 * * * ?")
@Async("batchExecutor")
public void processBatchJob() {
// 批量处理逻辑
}
@Bean("batchExecutor")
public ThreadPoolTaskExecutor batchExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(4);
executor.setMaxPoolSize(8);
// ...
return executor;
}
}
推荐优先级总结(2026 年视角)
| 优先级 | 方式 | 推荐场景 | 推荐指数 |
|---|---|---|---|
| ★★★★★ | @Async + 自定义线程池 | 99% 普通异步任务 | 最高 |
| ★★★★☆ | CompletableFuture | 需要结果、编排、并行聚合 | 很高 |
| ★★★★☆ | 虚拟线程(enabled=true) | 高并发 IO 密集型 | 强烈推荐 |
| ★★★☆☆ | ThreadPoolTaskExecutor 手动 | 精细控制、批量任务 | 常用 |
| ★★☆☆☆ | Java 原生 Executors | 非 Spring 场景、测试 | 谨慎 |
| ★★☆☆☆ | @Scheduled + 多线程 | 定时批量处理 | 特定场景 |
性能提升关键点(架构层面)
- 异步化非核心路径(邮件、日志、推送、文件处理)
- 线程池参数合理调优(核心数 ≈ CPU核数*2 ~ 3,队列容量 50~200)
- 拒绝策略选 CallerRunsPolicy(防止雪崩)
- 异常捕获(@Async 方法异常默认被吞掉)
- 虚拟线程优先(IO 密集场景可提升 5~20 倍吞吐)
- 监控(Micrometer + Prometheus + Grafana 监控线程池状态)
你当前项目中主要想解决哪类多线程问题?
是接口响应慢、批量任务卡顿、还是想引入虚拟线程?可以告诉我具体场景,我可以给出更针对性的代码和调优建议。
以上就是SpringBoot中实现多线程六种方式大全的详细内容,更多关于SpringBoot实现多线程方式的资料请关注脚本之家其它相关文章!
