欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

springboot CompletableFuture并行計算及使用方法

 更新時間:2024年05月07日 09:35:15   作者:張占嶺  
CompletableFuture基于 Future 和 CompletionStage 接口,利用線程池、回調(diào)函數(shù)、異常處理、組合操作等機(jī)制,提供了強(qiáng)大而靈活的異步編程功能,這篇文章主要介紹了springboot CompletableFuture并行計算及使用方法,需要的朋友可以參考下

在Spring中,CompletableFuture通常用于異步編程,可以方便地處理異步任務(wù)的執(zhí)行和結(jié)果處理,CompletableFuture 是 Java 8 引入的一個類,用于支持異步編程和并發(fā)操作。它基于 Future 和 CompletionStage 接口,提供了豐富的方法來處理異步任務(wù)的執(zhí)行和結(jié)果處理。

下面是 CompletableFuture 實現(xiàn)的一些關(guān)鍵原理:

  • 線程池支持CompletableFuture 內(nèi)部使用線程池來執(zhí)行異步任務(wù),可以通過指定不同的線程池來控制任務(wù)的執(zhí)行方式。默認(rèn)情況下,CompletableFuture 使用 ForkJoinPool.commonPool() 作為默認(rèn)的線程池。

  • 回調(diào)函數(shù)CompletableFuture 支持鏈?zhǔn)秸{(diào)用,可以通過 thenApply()thenAccept()thenRun()thenCompose() 等方法添加回調(diào)函數(shù),在異步任務(wù)完成后處理任務(wù)的結(jié)果或執(zhí)行下一步操作。

  • 異常處理CompletableFuture 提供了 exceptionally()handle()whenComplete() 等方法來處理異步任務(wù)中可能拋出的異常,確保異常能夠被捕獲并處理。

  • 組合操作CompletableFuture 支持多個 CompletableFuture 對象之間的組合操作,如 thenCombine()thenCompose()allOf()anyOf() 等方法,實現(xiàn)并行執(zhí)行、串行執(zhí)行、等待所有任務(wù)完成等功能。

  • CompletableFuture 工廠方法:除了 supplyAsync() 方法外,CompletableFuture 還提供了一系列工廠方法來創(chuàng)建 CompletableFuture 對象,如 runAsync()completedFuture()failedFuture() 等,方便快速創(chuàng)建并管理異步任務(wù)。

總的來說,CompletableFuture 的實現(xiàn)基于 Future 和 CompletionStage 接口,利用線程池、回調(diào)函數(shù)、異常處理、組合操作等機(jī)制,提供了強(qiáng)大而靈活的異步編程功能,使得開發(fā)人員能夠更加方便地處理異步任務(wù)的執(zhí)行和結(jié)果處理。

使用方法(一)鏈?zhǔn)?/h2>

如果我們的業(yè)務(wù)方法已經(jīng)寫完了,這時可以直接通過supplyAsync方法來調(diào)用這些已知的方法,而不需要重新開發(fā)

CompletableFuture<String> a1 = CompletableFuture.supplyAsync(() -> {
      try {
          Thread.sleep(1000);
      } catch (InterruptedException e) {
          throw new RuntimeException(e);
      }
      return "Hello World";
  });
  CompletableFuture<String> a2 = CompletableFuture.supplyAsync(() -> {
      try {
          Thread.sleep(2000);
      } catch (InterruptedException e) {
          throw new RuntimeException(e);
      }
      return "Hello World";
  });
  CompletableFuture<String> a3 = CompletableFuture.supplyAsync(() -> {
      try {
          Thread.sleep(3000);
      } catch (InterruptedException e) {
          throw new RuntimeException(e);
      }
      return "Hello World";
  });
  // 這塊最后是并行計算時間為3秒
  CompletableFuture.allOf(a1, a2, a3).join();
  String result = a1.get() + " | " + a2.get() + " | " + a3.get();

使用方法(二)獨立方法

如果方法比較獨立,并且之前沒有開發(fā)過,那么你可以通過異步方法來將這些邏輯與調(diào)用代碼解耦

@Service
@EnableAsync
public class ParallelTaskService {
    @Async
    public CompletableFuture<String> task1() {
        // 模擬一個耗時操作
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return CompletableFuture.completedFuture("Task 1 completed");
    }
    @Async
    public CompletableFuture<String> task2() {
        // 模擬另一個耗時操作
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return CompletableFuture.completedFuture("Task 2 completed");
    }
}
// 并行計算時,響應(yīng)時間是2和3秒之中最大值,即3秒
@GetMapping("/hello-world2")
public CompletableFuture<String> helloWorld2() {
    CompletableFuture<String> task1Result = parallelTaskService.task1();
    CompletableFuture<String> task2Result = parallelTaskService.task2();
    // 等待所有任務(wù)都完成
    CompletableFuture<Void> allOf = CompletableFuture.allOf(task1Result, task2Result);
    // 處理所有任務(wù)完成后的邏輯
    return allOf.thenApply(voidResult -> {
        String result = task1Result.join() + " | " + task2Result.join();
        return result;
    });
}

到此這篇關(guān)于springboot CompletableFuture并行計算的文章就介紹到這了,更多相關(guān)springboot 并行計算內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Mybatis接口Mapper內(nèi)的方法為啥不能重載嗎

    Mybatis接口Mapper內(nèi)的方法為啥不能重載嗎

    這篇文章主要介紹了Mybatis接口Mapper內(nèi)的方法為啥不能重載嗎,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • SpringBoot bean加載順序怎樣查看(源碼解讀)

    SpringBoot bean加載順序怎樣查看(源碼解讀)

    這篇文章主要介紹了SpringBoot bean加載順序怎樣查看(源碼解讀)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • idea web項目沒有小藍(lán)點的的兩種解決方法

    idea web項目沒有小藍(lán)點的的兩種解決方法

    本文主要介紹了idea web項目沒有小藍(lán)點的的兩種解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • java SelectableChannel的使實例用法講解

    java SelectableChannel的使實例用法講解

    在本篇文章里小編給大家整理的是一篇關(guān)于java SelectableChannel的使實例用法講解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2021-03-03
  • Kotlin中l(wèi)et、run、with、apply及also的用法和差別

    Kotlin中l(wèi)et、run、with、apply及also的用法和差別

    作用域函數(shù)是Kotlin比較重要的一個特性,分為5種let、run、with、apply及also,這五個函數(shù)的工作方式非常相似,但是我們需要了解這5種函數(shù)的差異,以便在不同的場景更好的利用它,這篇文章主要介紹了Kotlin中l(wèi)et、run、with、apply及also的差別,需要的朋友可以參考下
    2023-11-11
  • Java實現(xiàn)酒店客房管理系統(tǒng)

    Java實現(xiàn)酒店客房管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Java實現(xiàn)酒店客房管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • Spring?Boot?整合?FreeMarker?實例分享

    Spring?Boot?整合?FreeMarker?實例分享

    這篇文章主要分享了Spring?Boot整合FreeMarker?實例FreeMarker是一款模板引擎,即一種基于模板和要改變的數(shù)據(jù),并用來生成輸出文本,更多相關(guān)介紹需要的小伙伴可以參考下面文章內(nèi)容
    2022-05-05
  • SpringBoot整合RabbitMQ及原理

    SpringBoot整合RabbitMQ及原理

    這篇文章主要介紹了SpringBoot整合RabbitMQ及其原理分析,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06
  • springboot實戰(zhàn)權(quán)限管理功能圖文步驟附含源碼

    springboot實戰(zhàn)權(quán)限管理功能圖文步驟附含源碼

    這篇文章主要為大家介紹了springboot實戰(zhàn)權(quán)限管理功能圖文步驟及示例源碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Java?Spring?boot?配置JDK和MAVEN開發(fā)環(huán)境的過程

    Java?Spring?boot?配置JDK和MAVEN開發(fā)環(huán)境的過程

    本文詳細(xì)介紹了如何配置JDK和Maven環(huán)境,包括JDK的安裝與環(huán)境變量設(shè)置,Maven的下載、配置環(huán)境變量和設(shè)置阿里云倉庫,最后簡述了在IntelliJ?IDEA中配置JDK和Maven的步驟,本教程適合Java開發(fā)新手進(jìn)行開發(fā)環(huán)境的搭建,確保順利進(jìn)行Java項目的開發(fā)
    2024-11-11

最新評論