最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot中實(shí)現(xiàn)多線程六種方式大全

 更新時(shí)間:2026年02月10日 09:33:56   作者:AI老李  
Spring Boot 提供了非常豐富的多線程支持手段,從最簡(jiǎn)單的注解到虛擬線程,可以滿足從簡(jiǎn)單異步任務(wù)到高并發(fā) IO/CPU 密集型場(chǎng)景的各種需求,下面列出目前(2026 年視角)最常用、最推薦的 6 種方式,需要的朋友可以參考下

Spring Boot 提供了非常豐富的多線程支持手段,從最簡(jiǎn)單的注解到虛擬線程(Java 21+ / 25+ 時(shí)代的主流方向),可以滿足從簡(jiǎn)單異步任務(wù)到高并發(fā) IO/CPU 密集型場(chǎng)景的各種需求。

下面列出目前(2026 年視角)最常用、最推薦的 6 種方式,并按推薦優(yōu)先級(jí)排序(從最常用 → 最前沿)。

1. @Async + @EnableAsync(最常用、最簡(jiǎn)單)

核心步驟

  1. 啟動(dòng)類或配置類加 @EnableAsync
  2. 方法加 @Async
  3. (可選)自定義線程池 ThreadPoolTaskExecutor
// 開啟異步
@EnableAsync
@SpringBootApplication
public class Application { ... }

// 異步方法
@Service
public class MailService {

    @Async
    public void sendMail(String to, String content) {
        // 耗時(shí)操作
        log.info("發(fā)送郵件中... Thread: {}", Thread.currentThread().getName());
    }
}

自定義線程池(強(qiáng)烈推薦)

@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);
    }
}

優(yōu)點(diǎn):零侵入、簡(jiǎn)單
缺點(diǎn):無法獲取返回值(需配合 CompletableFuture)

2. CompletableFuture + @Async(有返回值 + 鏈?zhǔn)骄幣牛?/h2>

適用場(chǎng)景:需要異步結(jié)果、任務(wù)編排、并行聚合、超時(shí)控制

@Service
public class UserService {

    @Async
    public CompletableFuture<User> getUserById(Long id) {
        // 模擬耗時(shí)
        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());
    }
}

優(yōu)點(diǎn):強(qiáng)大組合能力、異常處理友好
缺點(diǎn):代碼稍復(fù)雜

3. ThreadPoolTaskExecutor 手動(dòng)提交任務(wù)(最靈活)

適用場(chǎng)景:需要精細(xì)控制線程池、批量任務(wù)、自定義拒絕策略

@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)

適用場(chǎng)景:不依賴 Spring 容器、測(cè)試、工具類、極簡(jiǎn)場(chǎng)景

// 方式1:直接 new Thread(不推薦)
new Thread(() -> doSomething()).start();

// 方式2:Executors 工具類
ExecutorService executor = Executors.newFixedThreadPool(10);
executor.submit(() -> doSomething());

注意:生產(chǎn)環(huán)境強(qiáng)烈不建議直接用 Executors.newFixedThreadPool(),因?yàn)?OOM 風(fēng)險(xiǎn)極大(無界隊(duì)列)。

5. 虛擬線程(Java 21+ / Spring Boot 3.2+ / 3.3+ 強(qiáng)烈推薦)

適用場(chǎng)景:高并發(fā) IO 密集型場(chǎng)景(接口調(diào)用、文件讀寫、數(shù)據(jù)庫(kù)查詢等)

開啟方式(Spring Boot 3.2+):

# application.yml
spring:
  threads:
    virtual:
      enabled: true

或代碼方式:

@Bean
public TaskExecutor taskExecutor() {
    return Executors.newVirtualThreadPerTaskExecutor();
}

@Async 也會(huì)自動(dòng)使用虛擬線程(當(dāng)啟用后)

優(yōu)點(diǎn):線程創(chuàng)建成本極低、可創(chuàng)建數(shù)十萬線程、極大提升吞吐量
缺點(diǎn):CPU 密集型任務(wù)不適合(仍建議用固定線程池)

6. Spring 定時(shí)任務(wù) + 多線程(@Scheduled + 線程池)

適用場(chǎng)景:定時(shí)批量處理、爬蟲、清理任務(wù)

@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;
    }
}

推薦優(yōu)先級(jí)總結(jié)(2026 年視角)

優(yōu)先級(jí)方式推薦場(chǎng)景推薦指數(shù)
★★★★★@Async + 自定義線程池99% 普通異步任務(wù)最高
★★★★☆CompletableFuture需要結(jié)果、編排、并行聚合很高
★★★★☆虛擬線程(enabled=true)高并發(fā) IO 密集型強(qiáng)烈推薦
★★★☆☆ThreadPoolTaskExecutor 手動(dòng)精細(xì)控制、批量任務(wù)常用
★★☆☆☆Java 原生 Executors非 Spring 場(chǎng)景、測(cè)試謹(jǐn)慎
★★☆☆☆@Scheduled + 多線程定時(shí)批量處理特定場(chǎng)景

性能提升關(guān)鍵點(diǎn)(架構(gòu)層面)

  1. 異步化非核心路徑(郵件、日志、推送、文件處理)
  2. 線程池參數(shù)合理調(diào)優(yōu)(核心數(shù) ≈ CPU核數(shù)*2 ~ 3,隊(duì)列容量 50~200)
  3. 拒絕策略選 CallerRunsPolicy(防止雪崩)
  4. 異常捕獲(@Async 方法異常默認(rèn)被吞掉)
  5. 虛擬線程優(yōu)先(IO 密集場(chǎng)景可提升 5~20 倍吞吐)
  6. 監(jiān)控(Micrometer + Prometheus + Grafana 監(jiān)控線程池狀態(tài))

你當(dāng)前項(xiàng)目中主要想解決哪類多線程問題?
是接口響應(yīng)慢、批量任務(wù)卡頓、還是想引入虛擬線程?可以告訴我具體場(chǎng)景,我可以給出更針對(duì)性的代碼和調(diào)優(yōu)建議。

以上就是SpringBoot中實(shí)現(xiàn)多線程六種方式大全的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot實(shí)現(xiàn)多線程方式的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java concurrency之共享鎖和ReentrantReadWriteLock_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java concurrency之共享鎖和ReentrantReadWriteLock_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    本篇文章主要介紹了Java concurrency之共享鎖和ReentrantReadWriteLock,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2017-06-06
  • Java包含抽象方法的枚舉類示例

    Java包含抽象方法的枚舉類示例

    這篇文章主要介紹了Java包含抽象方法的枚舉類,結(jié)合實(shí)例形式分析了Java包含抽象方法的枚舉類實(shí)現(xiàn)方法與相關(guān)操作技巧,需要的朋友可以參考下
    2019-08-08
  • Spring源碼解密之自定義標(biāo)簽與解析

    Spring源碼解密之自定義標(biāo)簽與解析

    這篇文章主要給大家介紹了關(guān)于Spring源碼解密之自定義標(biāo)簽與解析的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • 詳解Spring獲取配置的三種方式

    詳解Spring獲取配置的三種方式

    這篇文章主要為大家詳細(xì)介紹了Spring獲取配置的三種方式:@Value方式動(dòng)態(tài)獲取單個(gè)配置、@ConfigurationProperties+前綴方式批量獲取配置以及Environment動(dòng)態(tài)獲取單個(gè)配置,感興趣的可以了解一下
    2022-03-03
  • java組件commons-fileupload實(shí)現(xiàn)文件上傳

    java組件commons-fileupload實(shí)現(xiàn)文件上傳

    這篇文章主要介紹了java借助commons-fileupload組件實(shí)現(xiàn)文件上傳,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • Ajax 驗(yàn)證用戶輸入的驗(yàn)證碼是否與隨機(jī)生成的一致

    Ajax 驗(yàn)證用戶輸入的驗(yàn)證碼是否與隨機(jī)生成的一致

    本文主要介紹了后臺(tái)驗(yàn)證用戶輸入的驗(yàn)證碼是否與隨機(jī)生成的驗(yàn)證碼一致的方法,具有很好的參考價(jià)值,下面跟著小編一起來看下吧
    2017-02-02
  • Spring Boot 訪問安全之認(rèn)證和鑒權(quán)詳解

    Spring Boot 訪問安全之認(rèn)證和鑒權(quán)詳解

    這篇文章主要介紹了Spring Boot 訪問安全之認(rèn)證和鑒權(quán),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 深入淺析HashMap key和value能否為null

    深入淺析HashMap key和value能否為null

    HashMap的key和value可為null,線程不安全,HashTable的key和value均不可為null,線程安全,ConcurrentHashMap在多線程場(chǎng)景下使用,key和value也不能為null,還對(duì)它們進(jìn)行了測(cè)試和底層代碼分析,本文介紹HashMap key和value能否為null,感興趣的朋友跟隨小編一起看看吧
    2025-04-04
  • Java中ZIP文件中文亂碼問題的解決指南

    Java中ZIP文件中文亂碼問題的解決指南

    文章介紹Java文件壓縮解壓中處理中文亂碼的解決方案,包括指定UTF-8編碼、使用緩沖流及Ant工具配置,確保文件名和內(nèi)容正確顯示,避免因字符集不一致導(dǎo)致的亂碼問題,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2025-09-09
  • springboot之security?FilterSecurityInterceptor的使用要點(diǎn)記錄

    springboot之security?FilterSecurityInterceptor的使用要點(diǎn)記錄

    這篇文章主要介紹了springboot之security?FilterSecurityInterceptor的使用要點(diǎn)記錄,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12

最新評(píng)論

四子王旗| 渭源县| 文水县| 贡觉县| 新乡市| 高碑店市| 兴海县| 麻栗坡县| 芷江| 扶风县| 繁峙县| 万宁市| 宁安市| 迁西县| 南乐县| 平乐县| 三原县| 紫云| 绍兴市| 兴宁市| 渝中区| 普洱| 绥江县| 渝北区| 平湖市| 鄢陵县| 建德市| 西青区| 屏东县| 当雄县| 汾西县| 自贡市| 定南县| 偃师市| 三台县| 寻乌县| SHOW| 丰宁| 仙居县| 大城县| 安阳市|