深入理解SpringBoot非同步機制

一、什麼是SpringBoot非同步?

在高並發場景下,同步的代碼可能會阻塞請求,導致服務響應慢、容量下降、客戶流失等問題。所以非同步相對於同步,有更好的用戶體驗,更高的性能和更好的可擴展性。

SpringBoot對非同步方法的支持可以幫助開發者實現非同步調用,使得程序代碼的執行流程和實際數據的處理過程分離,從而提高程序的性能。它是通過將耗時的操作放入獨立的線程,使主線程無需等待而直接返迴響應。

二、如何在SpringBoot中使用非同步?

SpringBoot提供了兩種非同步實現方式,一種是通過非同步介面(Async)實現,另一種是通過非同步註解(@Async)實現。

1.非同步介面

SpringBoot通過提供Async介面或者實現Async介面的方法,可以開啟非同步處理,簡單使用過程:

@Service
public class AsyncService {
    @Autowired
    private AsyncTask asyncTask;

    public void executeAsyncTask() {
        asyncTask.doTaskOne();
        asyncTask.doTaskTwo();
        asyncTask.doTaskThree();
    }
}

@Component
public class AsyncTask {
    @Async
    public void doTaskOne() throws Exception {
        log.info("開始做任務一");
        long start = System.currentTimeMillis();
        Thread.sleep(1000);
        long end = System.currentTimeMillis();
        log.info("完成任務一,耗時:" + (end - start) + "毫秒");
    }

    @Async
    public void doTaskTwo() throws Exception {
        log.info("開始做任務二");
        long start = System.currentTimeMillis();
        Thread.sleep(1000);
        long end = System.currentTimeMillis();
        log.info("完成任務二,耗時:" + (end - start) + "毫秒");
    }

    @Async
    public void doTaskThree() throws Exception {
        log.info("開始做任務三");
        long start = System.currentTimeMillis();
        Thread.sleep(1000);
        long end = System.currentTimeMillis();
        log.info("完成任務三,耗時:" + (end - start) + "毫秒");
    }
}

2.非同步註解

SpringBoot通過提供@Async方法級別的非同步支持,實現非同步調用。使用過程如下:

@Service
public class AsyncService {
    @Async("asyncExecutor")
    public void executeAsyncTaskOne() {
        log.info("開始執行任務一:線程-" + Thread.currentThread().getName());
        long start = System.currentTimeMillis();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        long end = System.currentTimeMillis();
        log.info("結束執行任務一:線程-" + Thread.currentThread().getName() + ",耗時:" + (end - start));
    }

    @Async("asyncExecutor")
    public void executeAsyncTaskTwo() {
        log.info("開始執行任務二:線程-" + Thread.currentThread().getName());
        long start = System.currentTimeMillis();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        long end = System.currentTimeMillis();
        log.info("結束執行任務二:線程-" + Thread.currentThread().getName() + ",耗時:" + (end - start));
    }

    @Async("asyncExecutor")
    public void executeAsyncTaskThree() {
        log.info("開始執行任務三:線程-" + Thread.currentThread().getName());
        long start = System.currentTimeMillis();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        long end = System.currentTimeMillis();
        log.info("結束執行任務三:線程-" + Thread.currentThread().getName() + ",耗時:" + (end - start));
    }
}

@Configuration
public class AsyncConfiguration {
    @Bean("asyncExecutor")
    public Executor asyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(10);
        executor.setMaxPoolSize(20);
        executor.setQueueCapacity(200);
        executor.initialize();
        return executor;
    }
}

三、非同步在SpringBoot中的應用場景

非同步操作在處理大量計算和高並發訪問場景下尤其有用。以下是非同步可以應用的場景:

1.發送郵件和簡訊

在發送郵件和簡訊通知時,通過非同步方式會大大縮小響應時間,加速發送速度。

2.數據抓取

在進行大數據量的數據抓取和處理時,非同步能夠幫助我們減少因為等待而浪費的時間。

3.文件上傳和下載

在文件上傳和下載時,非同步操作能夠減輕伺服器的負擔,避免因為等待而浪費相應時間。

4.並發請求的響應

在Web應用程序中有大量並發請求的情況下,使用非同步操作可以避免阻塞請求,保證Web伺服器的高性能。

四、總結

通過SpringBoot非同步的使用,我們可以為用戶提供更好的體驗,同時提高程序的性能和可擴展性。同時,我們需要根據實際業務需要選擇同時線程數量合適的線程池,這樣我們才能達到預期的效果。

原創文章,作者:AVPP,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/134934.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
AVPP的頭像AVPP
上一篇 2024-10-04 00:09
下一篇 2024-10-04 00:09

相關推薦

  • 從ga角度解讀springboot

    springboot作為目前廣受歡迎的Java開發框架,其中的ga機制在整個開發過程中起著至關重要的作用。 一、ga是什麼 ga即Group Artifacts的縮寫,它是Mave…

    編程 2025-04-29
  • Spring S_CSRF防護機制實現及應用

    Spring S_CSRF防護機制是Spring Security框架提供的一個針對跨站請求偽造攻擊(CSRF)的保護機制。本文將從以下幾個方面詳細介紹Spring S_CSRF防…

    編程 2025-04-28
  • SpringBoot Get方式請求傳參用法介紹

    本文將從以下多個方面對SpringBoot Get方式請求傳參做詳細的闡述,包括URL傳參、路徑傳參、請求頭傳參、請求體傳參等,幫助讀者更加深入地了解Get請求方式下傳參的相關知識…

    編程 2025-04-27
  • Python的垃圾回收機制

    本文將對Python的垃圾回收機制進行詳細闡述,著重介紹它的基本原理和實現方式。此外,我們還將介紹常見的問題及解決方法,並給出相應的代碼示例。 一、Python的垃圾回收概述 垃圾…

    編程 2025-04-27
  • SpringBoot如何設置不輸出Info日誌

    本篇文章將帶您了解如何在SpringBoot項目中關閉Info級別日誌輸出。 一、為什麼要關閉Info日誌 在開發中,我們經常會使用Log4j、Logback等框架來輸出日誌信息,…

    編程 2025-04-27
  • 機制與策略分離

    了解機制與策略分離的解決方法與優勢 一、概述 機制與策略分離是一種軟體設計理念,它將複雜的系統、組件等模塊化,通過分離機制與策略,把模塊實現的方式與具體使用方式分開。 機制是實現某…

    編程 2025-04-27
  • 深入解析Vue3 defineExpose

    Vue 3在開發過程中引入了新的API `defineExpose`。在以前的版本中,我們經常使用 `$attrs` 和` $listeners` 實現父組件與子組件之間的通信,但…

    編程 2025-04-25
  • 深入理解byte轉int

    一、位元組與比特 在討論byte轉int之前,我們需要了解位元組和比特的概念。位元組是計算機存儲單位的一種,通常表示8個比特(bit),即1位元組=8比特。比特是計算機中最小的數據單位,是…

    編程 2025-04-25
  • 深入理解Flutter StreamBuilder

    一、什麼是Flutter StreamBuilder? Flutter StreamBuilder是Flutter框架中的一個內置小部件,它可以監測數據流(Stream)中數據的變…

    編程 2025-04-25
  • 解決springboot中scanBasePackages無法讀取子包的問題

    在使用springboot搭建項目時,可能會遇到scanBasePackages無法讀取子包的問題。本文將從幾個方面詳細闡述如何解決這個問題。 一、問題描述 在使用Springbo…

    編程 2025-04-25

發表回復

登錄後才能評論