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

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

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

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

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

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

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

特點:

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

適用場景:日志記錄、郵件發(fā)送、短信通知等簡單異步任務(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)對突發(fā)高并發(fā)
        executor.setQueueCapacity(100); // 任務(wù)隊列容量,緩沖待執(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. 顯式使用線程池(精細控制)

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

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

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

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

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

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

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

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

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

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

    /**
     * 構(gòu)造函數(shù)
     * @param source 事件源(當(dāng)前發(fā)布事件的對象)
     * @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ā)送訂單通知、更新庫存、記錄日志等)
    }
}

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

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

    // 創(chuàng)建固定大小的JDK原生線程池(10個核心線程)
    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. 異步定時任務(wù)(周期性處理)

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

總結(jié)

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

實踐建議:

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

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

相關(guān)文章

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

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

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

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

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

    Java中Lambda表達式的使用詳細教程

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

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

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

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

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

    java實現(xiàn)線上環(huán)境遠程debug調(diào)試過程

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

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

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

    Spring中Bean掃描原理詳情

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

    簡單了解JavaBean作用及常用操作

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

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

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

最新評論

普洱| 沈阳市| 庆安县| 汶上县| 平武县| 临漳县| 拉孜县| 周宁县| 油尖旺区| 广宁县| 乳山市| 延长县| 合川市| 巴南区| 周口市| 高陵县| 新邵县| 天峨县| 昭觉县| 满城县| 汾西县| 巴塘县| 当阳市| 房山区| 陇川县| 牙克石市| 皮山县| 南木林县| 北宁市| 汝州市| 临洮县| 海兴县| 顺昌县| 成都市| 武鸣县| 新兴县| 九龙县| 梧州市| 安义县| 乌拉特中旗| 弥勒县|