SpringBoot中实现多线程六种方式大全

 更新时间:2026年02月10日 09:33:56   作者:AI老李  
Spring Boot 提供了非常丰富的多线程支持手段,从最简单的注解到虚拟线程,可以满足从简单异步任务到高并发 IO/CPU 密集型场景的各种需求,下面列出目前(2026 年视角)最常用、最推荐的 6 种方式,需要的朋友可以参考下

Spring Boot 提供了非常丰富的多线程支持手段,从最简单的注解到虚拟线程(Java 21+ / 25+ 时代的主流方向),可以满足从简单异步任务到高并发 IO/CPU 密集型场景的各种需求。

下面列出目前(2026 年视角)最常用、最推荐的 6 种方式,并按推荐优先级排序(从最常用 → 最前沿)。

1. @Async + @EnableAsync(最常用、最简单)

核心步骤

  1. 启动类或配置类加 @EnableAsync
  2. 方法加 @Async
  3. (可选)自定义线程池 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 + 多线程定时批量处理特定场景

性能提升关键点(架构层面)

  1. 异步化非核心路径(邮件、日志、推送、文件处理)
  2. 线程池参数合理调优(核心数 ≈ CPU核数*2 ~ 3,队列容量 50~200)
  3. 拒绝策略选 CallerRunsPolicy(防止雪崩)
  4. 异常捕获(@Async 方法异常默认被吞掉)
  5. 虚拟线程优先(IO 密集场景可提升 5~20 倍吞吐)
  6. 监控(Micrometer + Prometheus + Grafana 监控线程池状态)

你当前项目中主要想解决哪类多线程问题?
是接口响应慢、批量任务卡顿、还是想引入虚拟线程?可以告诉我具体场景,我可以给出更针对性的代码和调优建议。

以上就是SpringBoot中实现多线程六种方式大全的详细内容,更多关于SpringBoot实现多线程方式的资料请关注脚本之家其它相关文章!

相关文章

  • Java concurrency之共享锁和ReentrantReadWriteLock_动力节点Java学院整理

    Java concurrency之共享锁和ReentrantReadWriteLock_动力节点Java学院整理

    本篇文章主要介绍了Java concurrency之共享锁和ReentrantReadWriteLock,非常具有实用价值,需要的朋友可以参考下
    2017-06-06
  • Java包含抽象方法的枚举类示例

    Java包含抽象方法的枚举类示例

    这篇文章主要介绍了Java包含抽象方法的枚举类,结合实例形式分析了Java包含抽象方法的枚举类实现方法与相关操作技巧,需要的朋友可以参考下
    2019-08-08
  • Spring源码解密之自定义标签与解析

    Spring源码解密之自定义标签与解析

    这篇文章主要给大家介绍了关于Spring源码解密之自定义标签与解析的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参借鉴,下面随着小编来一起学习学习吧。
    2018-01-01
  • 详解Spring获取配置的三种方式

    详解Spring获取配置的三种方式

    这篇文章主要为大家详细介绍了Spring获取配置的三种方式:@Value方式动态获取单个配置、@ConfigurationProperties+前缀方式批量获取配置以及Environment动态获取单个配置,感兴趣的可以了解一下
    2022-03-03
  • java组件commons-fileupload实现文件上传

    java组件commons-fileupload实现文件上传

    这篇文章主要介绍了java借助commons-fileupload组件实现文件上传,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • Ajax 验证用户输入的验证码是否与随机生成的一致

    Ajax 验证用户输入的验证码是否与随机生成的一致

    本文主要介绍了后台验证用户输入的验证码是否与随机生成的验证码一致的方法,具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • Spring Boot 访问安全之认证和鉴权详解

    Spring Boot 访问安全之认证和鉴权详解

    这篇文章主要介绍了Spring Boot 访问安全之认证和鉴权,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • 深入浅析HashMap key和value能否为null

    深入浅析HashMap key和value能否为null

    HashMap的key和value可为null,线程不安全,HashTable的key和value均不可为null,线程安全,ConcurrentHashMap在多线程场景下使用,key和value也不能为null,还对它们进行了测试和底层代码分析,本文介绍HashMap key和value能否为null,感兴趣的朋友跟随小编一起看看吧
    2025-04-04
  • Java中ZIP文件中文乱码问题的解决指南

    Java中ZIP文件中文乱码问题的解决指南

    文章介绍Java文件压缩解压中处理中文乱码的解决方案,包括指定UTF-8编码、使用缓冲流及Ant工具配置,确保文件名和内容正确显示,避免因字符集不一致导致的乱码问题,本文结合示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2025-09-09
  • springboot之security FilterSecurityInterceptor的使用要点记录

    springboot之security FilterSecurityInterceptor的使用要点记录

    这篇文章主要介绍了springboot之security FilterSecurityInterceptor的使用要点记录,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12

最新评论