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

SpringBoot中實(shí)現(xiàn)異步的六種方式

 更新時(shí)間:2026年03月10日 09:45:37   作者:彭于晏Yan  
在SpringBoot開發(fā)中,合理運(yùn)用多線程技術(shù)能顯著提升系統(tǒng)吞吐量與響應(yīng)速度,本文總結(jié)了6種在SpringBoot中實(shí)現(xiàn)多線程的技術(shù)方式,包括注解式異步、顯式線程池、CompletableFuture、事件監(jiān)聽、JDK原生線程池和異步定時(shí)任務(wù),每種方式都有其適用場(chǎng)景,需要的朋友可以參考下

在Spring Boot開發(fā)中,合理運(yùn)用多線程技術(shù)能顯著提升系統(tǒng)吞吐量與響應(yīng)速度。

本文梳理了 6 種落地性極強(qiáng)的多線程實(shí)現(xiàn)方式,覆蓋從「簡(jiǎn)單注解式異步」到「復(fù)雜多任務(wù)編排」的全場(chǎng)景,結(jié)合不同業(yè)務(wù)場(chǎng)景(高并發(fā)、系統(tǒng)解耦、周期性任務(wù))和技術(shù)訴求(開發(fā)效率、精細(xì)控制、可觀測(cè)性),可靈活選型;同時(shí)補(bǔ)充生產(chǎn)級(jí)避坑指南、線程池調(diào)優(yōu)策略和監(jiān)控方案,確保異步方案不僅 “能用”,更能 “穩(wěn)定用、高效用”

1. @Async注解(開發(fā)首選)

基于AOP動(dòng)態(tài)代理機(jī)制,實(shí)現(xiàn)方法級(jí)別的異步執(zhí)行,無(wú)需手動(dòng)管理線程生命周期。

特點(diǎn):

  • 低侵入性,僅需注解即可實(shí)現(xiàn)異步,開發(fā)效率極高;
  • 必須配合自定義線程池使用,避免默認(rèn)SimpleAsyncTaskExecutor(無(wú)復(fù)用,性能差);

適用場(chǎng)景:日志記錄、郵件發(fā)送、短信通知等簡(jiǎn)單異步任務(wù)。

配置自定義線程池并開啟異步支持:

@Configuration
@EnableAsync // 開啟Spring異步支持
public class AsyncConfig {
    /**
     * 自定義異步線程池配置
     * @return 線程池執(zhí)行器
     */
    @Bean("taskExecutor") // 自定義線程池名稱,便于指定使用
    public Executor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(4); // 核心線程數(shù),默認(rèn)建議設(shè)置為CPU核心數(shù)
        executor.setMaxPoolSize(8); // 最大線程數(shù),建議為核心線程數(shù)的2倍,應(yīng)對(duì)突發(fā)高并發(fā)
        executor.setQueueCapacity(100); // 任務(wù)隊(duì)列容量,緩沖待執(zhí)行任務(wù)
        executor.setThreadNamePrefix("Async-"); // 線程名稱前綴,便于日志排查
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); // 拒絕策略:主線程執(zhí)行
        executor.initialize(); // 初始化線程池
        return executor;
    }
}
  • 在業(yè)務(wù)方法上標(biāo)注異步注解:
@Service
public class DemoService {

    @Async("taskExecutor") // 指定使用自定義的線程池
    public void sendEmail(String email) {
        System.out.println("線程:" + Thread.currentThread().getName() + "消息ID:" +" 正在發(fā)送郵件至:" + email);
    }
}

2. 顯式使用線程池(精細(xì)控制)

  • 直接注入自定義ThreadPoolTaskExecutor,手動(dòng)提交任務(wù)執(zhí)行,完全掌控線程生命周期。
  • 適用場(chǎng)景:高并發(fā)數(shù)據(jù)處理、大批量文件解析、復(fù)雜計(jì)算任務(wù)等需要精細(xì)控制線程參數(shù)的場(chǎng)景。
@Service
public class DemoService {

    // 注入自定義線程池(對(duì)應(yīng)AsyncConfig中配置的bean)
    @Resource(name = "taskExecutor")
    private ThreadPoolTaskExecutor executor;

    /**
     * 異步生成業(yè)務(wù)報(bào)表
     */
    public void generateReport() {
        for (int i = 0; i < 50; i++) {
            // 提交異步任務(wù)到線程池
            executor.execute(() -> {
                System.out.println("線程:" + Thread.currentThread().getName() + " 正在生成報(bào)表");
                // 報(bào)表生成核心邏輯(數(shù)據(jù)查詢、計(jì)算、導(dǎo)出等)
            });
        }
    }
}

3. CompletableFuture(多任務(wù)編排)

  • 支持多異步任務(wù)的組合、串行、并行執(zhí)行,可便捷處理任務(wù)執(zhí)行結(jié)果,適配復(fù)雜業(yè)務(wù)流。
  • CompletableFuture 默認(rèn)使用ForkJoinPool.commonPool(),該線程池是全局共享的,高并發(fā)下易被占滿,建議指定自定義線程池
  • 適用場(chǎng)景:下單流程(庫(kù)存+余額+物流校驗(yàn))、數(shù)據(jù)聚合(多接口并行查詢)等需組合多個(gè)異步操作的復(fù)雜業(yè)務(wù)流。
@Service
public class DemoService {
    
    @Resource(name = "taskExecutor")
	private ThreadPoolTaskExecutor executor;

    /**
     * 異步檢查庫(kù)存
     * @return 庫(kù)存是否充足(Future結(jié)果)
     */
    public CompletableFuture<Boolean> checkInventory() {
        // 異步執(zhí)行庫(kù)存檢查邏輯
        return CompletableFuture.supplyAsync(() -> {
            System.out.println("線程:" + Thread.currentThread().getName() + " 檢查庫(kù)存");
            return true; // 模擬庫(kù)存充足
        },executor);
    }

    /**
     * 異步扣減余額
     * @return 余額扣減是否成功(Future結(jié)果)
     */
    public CompletableFuture<Boolean> deductBalance() {
        return CompletableFuture.supplyAsync(() -> {
            System.out.println("線程:" + Thread.currentThread().getName() + " 扣減余額");
            return true; // 模擬扣減成功
        },executor);
    }

    /**
     * 下單核心邏輯:并行執(zhí)行庫(kù)存檢查+余額扣減,完成后執(zhí)行后續(xù)操作
     */
    public void placeOrder() {
        // 并行執(zhí)行多個(gè)異步任務(wù)
        CompletableFuture.allOf(checkInventory(), deductBalance())
                .thenRun(() -> { // 所有任務(wù)完成后執(zhí)行
                    System.out.println("線程:" + Thread.currentThread().getName() + " 所有前置校驗(yàn)完成,開始創(chuàng)建訂單");
                    // 訂單創(chuàng)建核心邏輯
                });
    }
}

4. 事件監(jiān)聽+@Async(系統(tǒng)解耦)

  • 基于Spring事件發(fā)布/訂閱機(jī)制,將業(yè)務(wù)邏輯解耦為“事件發(fā)布”和“事件處理”,結(jié)合@Async實(shí)現(xiàn)異步處理。
  • 適用場(chǎng)景:系統(tǒng)解耦場(chǎng)景(如訂單創(chuàng)建后,異步觸發(fā)物流通知、積分發(fā)放、數(shù)據(jù)統(tǒng)計(jì)等)。
  • 定義自定義事件:
/**
 * 訂單創(chuàng)建事件
 */
public class OrderCreatedEvent extends ApplicationEvent {
    private Long orderId; // 訂單ID

    /**
     * 構(gòu)造函數(shù)
     * @param source 事件源(當(dāng)前發(fā)布事件的對(duì)象)
     * @param orderId 訂單ID
     */
    public OrderCreatedEvent(Object source, Long orderId) {
        super(source);
        this.orderId = orderId;
    }

    // getter
    public Long getOrderId() {
        return orderId;
    }
}
  • 發(fā)布事件:
@Service
public class DemoService {

    // 注入Spring事件發(fā)布器
    @Resource
    private ApplicationEventPublisher publisher;

    /**
     * 創(chuàng)建訂單(核心邏輯)
     */
    public void createOrder() {
        // 1. 執(zhí)行創(chuàng)建訂單的核心邏輯
        Long orderId = 123L; // 模擬生成訂單ID
        System.out.println("主線程:創(chuàng)建訂單,訂單ID:" + orderId);

        // 2. 發(fā)布訂單創(chuàng)建事件
        publisher.publishEvent(new OrderCreatedEvent(this, orderId));
    }
}
  • 異步監(jiān)聽并處理事件:
@Component
public class OrderListener {
    /**
     * 異步處理訂單創(chuàng)建事件
     * @param event 訂單創(chuàng)建事件
     */
    @Async("taskExecutor") // 異步處理,指定自定義線程池
    @EventListener // 監(jiān)聽OrderCreatedEvent事件
    public void handleOrderCreatedEvent(OrderCreatedEvent event) {
        Long orderId = event.getOrderId();
        System.out.println("線程:" + Thread.currentThread().getName() + " 處理訂單事件,訂單ID:" + orderId);
        // 事件處理邏輯(如:發(fā)送訂單通知、更新庫(kù)存、記錄日志等)
    }
}

5. JDK原生線程池(輕量使用)

  • 簡(jiǎn)單并發(fā)任務(wù)、臨時(shí)性多線程需求(無(wú)需Spring容器管理線程池的場(chǎng)景)。
@Service
public class DemoService {

    // 創(chuàng)建固定大小的JDK原生線程池(10個(gè)核心線程)
    private ExecutorService executor1 = Executors.newFixedThreadPool(10, r -> {
        Thread thread = new Thread(r);
        thread.setName("JdkAsync-"); // 線程名稱前綴
        return thread;
    });

    /**
     * 異步處理數(shù)據(jù)
     */
    public void processData() {
        // 提交任務(wù)到線程池執(zhí)行
        executor1.submit(() -> {
            System.out.println("線程:" + Thread.currentThread().getName() + " 正在處理數(shù)據(jù)");
            // 數(shù)據(jù)處理核心邏輯
        });
    }
}

6. 異步定時(shí)任務(wù)(周期性處理)

  • 結(jié)合定時(shí)任務(wù)與異步執(zhí)行,避免定時(shí)任務(wù)阻塞主線程,適合周期性數(shù)據(jù)處理、定時(shí)清理、定時(shí)同步等場(chǎng)景。
@Configuration
@EnableAsync // 開啟異步支持
@EnableScheduling // 開啟定時(shí)任務(wù)支持
public class ScheduledConfig {
    /**
     * 異步定時(shí)執(zhí)行報(bào)表統(tǒng)計(jì)任務(wù)
     * fixedRate = 5000:每隔5秒執(zhí)行一次(從上一次執(zhí)行開始計(jì)時(shí))
     */
    @Async("taskExecutor") // 異步執(zhí)行,指定自定義線程池
    @Scheduled(fixedRate = 5000)
    public void reportJob() {
        System.out.println("線程:" + Thread.currentThread().getName() + " 執(zhí)行定時(shí)報(bào)表統(tǒng)計(jì),時(shí)間:" + System.currentTimeMillis());
        // 周期性數(shù)據(jù)處理邏輯(如:統(tǒng)計(jì)昨日訂單、清理無(wú)效數(shù)據(jù)、同步第三方數(shù)據(jù)等)
    }
}

總結(jié)

實(shí)現(xiàn)方式適用場(chǎng)景復(fù)雜度開發(fā)效率性能風(fēng)險(xiǎn)點(diǎn)
@Async 注解簡(jiǎn)單異步任務(wù)(郵件、日志)注解失效、異常未捕獲
顯式線程池高并發(fā)數(shù)據(jù)處理、精細(xì)線程控制線程池參數(shù)不合理導(dǎo)致 OOM
CompletableFuture多任務(wù)編排、復(fù)雜業(yè)務(wù)流默認(rèn)線程池共享導(dǎo)致阻塞
事件監(jiān)聽 +@Async系統(tǒng)解耦、多異步操作觸發(fā)事件丟失、重復(fù)消費(fèi)
JDK 原生線程池簡(jiǎn)單并發(fā)、臨時(shí)性任務(wù)未優(yōu)雅關(guān)閉導(dǎo)致任務(wù)丟失
異步定時(shí)任務(wù)周期性數(shù)據(jù)處理定時(shí)任務(wù)堆積、執(zhí)行時(shí)間重疊

實(shí)踐建議:

  • 通過(guò)合理選型,Spring Boot應(yīng)用的吞吐量可提升3-10倍。
  • 生產(chǎn)環(huán)境優(yōu)先選擇**@Async + 自定義線程池**的組合方案:既保證開發(fā)效率,又能通過(guò)線程池參數(shù)控制避免資源耗盡;
  • 復(fù)雜業(yè)務(wù)流(如下單、支付)建議使用CompletableFuture做任務(wù)編排;
  • 系統(tǒng)解耦場(chǎng)景優(yōu)先采用事件監(jiān)聽+@Async,降低模塊間耦合度。

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

相關(guān)文章

  • 在IDEA中配置Selenium和WebDriver的具體操作

    在IDEA中配置Selenium和WebDriver的具體操作

    在自動(dòng)化測(cè)試領(lǐng)域Selenium是一款非常流行的開源工具,它支持多種瀏覽器,并提供了豐富的API供開發(fā)者使用,而WebDriver則是Selenium的一個(gè)重要組件,它負(fù)責(zé)驅(qū)動(dòng)瀏覽器執(zhí)行測(cè)試腳本,這篇文章主要給大家介紹了在IDEA中配置Selenium和WebDriver的具體操作,需要的朋友可以參考下
    2024-10-10
  • Java中l(wèi)ist根據(jù)id獲取對(duì)象的幾種方式

    Java中l(wèi)ist根據(jù)id獲取對(duì)象的幾種方式

    這篇文章主要給大家介紹了關(guān)于Java中l(wèi)ist根據(jù)id獲取對(duì)象的幾種方式,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • Java中Lambda表達(dá)式的使用詳細(xì)教程

    Java中Lambda表達(dá)式的使用詳細(xì)教程

    這篇文章將通過(guò)示例為大家詳細(xì)展示Java中Lambda表達(dá)式的用法,同時(shí)也會(huì)介紹Lambda的相關(guān)知識(shí),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-05-05
  • springboot2.5.6集成RabbitMq實(shí)現(xiàn)Topic主題模式(推薦)

    springboot2.5.6集成RabbitMq實(shí)現(xiàn)Topic主題模式(推薦)

    這篇文章主要介紹了springboot2.5.6集成RabbitMq實(shí)現(xiàn)Topic主題模式(推薦),pom.xml引入依賴和常量類創(chuàng)建,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2021-11-11
  • Spring Boot2.3 新特性分層JAR的使用

    Spring Boot2.3 新特性分層JAR的使用

    這篇文章主要介紹了Spring Boot2.3 新特性分層JAR的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • java實(shí)現(xiàn)線上環(huán)境遠(yuǎn)程debug調(diào)試過(guò)程

    java實(shí)現(xiàn)線上環(huán)境遠(yuǎn)程debug調(diào)試過(guò)程

    本文介紹了在Docker容器中配置Tomcat和Spring Boot進(jìn)行遠(yuǎn)程調(diào)試的方法,通過(guò)配置`CATALINA_OPTS`或`JPDA`參數(shù),可以在測(cè)試環(huán)境中啟動(dòng)Tomcat或Spring Boot應(yīng)用的debug模式,然后在本地IDEA中設(shè)置斷點(diǎn)進(jìn)行調(diào)試,從而更高效地定位和解決問(wèn)題
    2025-02-02
  • 詳解如何在Java中創(chuàng)建Excel迷你圖

    詳解如何在Java中創(chuàng)建Excel迷你圖

    迷你圖是一種簡(jiǎn)潔而有效的數(shù)據(jù)可視化方式,常用于展示趨勢(shì)和變化,通常被用于數(shù)據(jù)儀表盤、報(bào)告和展示中,以便在有限的空間內(nèi)展示多個(gè)數(shù)據(jù)集的趨勢(shì),今天小編為大家介紹如何在Java中創(chuàng)建Excel迷你圖,需要的朋友可以參考下
    2023-10-10
  • Spring中Bean掃描原理詳情

    Spring中Bean掃描原理詳情

    這篇文章主要介紹了Spring中Bean掃描原理詳情,文章為榮啊主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-07-07
  • 簡(jiǎn)單了解JavaBean作用及常用操作

    簡(jiǎn)單了解JavaBean作用及常用操作

    這篇文章主要介紹了簡(jiǎn)單了解JavaBean作用及常用操作,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Spring?Security使用數(shù)據(jù)庫(kù)登錄認(rèn)證授權(quán)

    Spring?Security使用數(shù)據(jù)庫(kù)登錄認(rèn)證授權(quán)

    本文主要介紹了Spring?Security使用數(shù)據(jù)庫(kù)登錄認(rèn)證授權(quán),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01

最新評(píng)論

临安市| 宝坻区| 望城县| 观塘区| 麻江县| 桐柏县| 邓州市| 沧州市| 库伦旗| 富裕县| 枝江市| 闻喜县| 万安县| 神池县| 凌云县| 济宁市| 久治县| 济源市| 临城县| 东海县| 穆棱市| 临清市| 莱芜市| 玛曲县| 治县。| 伊金霍洛旗| 马山县| 德昌县| 威远县| 瑞丽市| 板桥市| 余江县| 柯坪县| 金平| 江北区| 温州市| 柳林县| 惠来县| 黎城县| 汉寿县| 湖口县|