中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

springboot~CompletableFuture并(bing)行計(ji)算(suan)

在Spring中,CompletableFuture通常用于異步編程,可以方便地處理異步任務的執行和結果處理,CompletableFuture 是 Java 8 引入(ru)的一個類,用(yong)于(yu)支(zhi)持異(yi)步(bu)編程和并發操作。它基(ji)于(yu) Future 和 CompletionStage 接(jie)口,提供了豐富的方法(fa)來處理(li)(li)異(yi)步(bu)任務的執行和結果處理(li)(li)。

下面是 CompletableFuture 實現的一些關鍵原理:

  1. 線程池支持CompletableFuture 內部使用線程池來執行異步任務,可以通過指定不同的線程池來控制任務的執行方式。默認情況下,CompletableFuture 使用 ForkJoinPool.commonPool() 作為默認(ren)的線(xian)程池。

  2. 回調函數CompletableFuture 支持鏈式調用,可以通過 thenApply(), thenAccept(), thenRun(), thenCompose() 等方法(fa)添加(jia)回(hui)調函數,在異(yi)步任務(wu)完成后處理任務(wu)的結果(guo)或執行下(xia)一步操作。

  3. 異常處理CompletableFuture 提供了 exceptionally(), handle(), whenComplete() 等方法(fa)來(lai)處理異(yi)步任務(wu)中可能拋(pao)出(chu)的異(yi)常(chang),確保異(yi)常(chang)能夠被捕獲并(bing)處理。

  4. 組合操作CompletableFuture 支持多個 CompletableFuture 對象之間的組合操作,如 thenCombine(), thenCompose(), allOf(), anyOf() 等(deng)方(fang)法,實現并行執行、串行執行、等(deng)待所有任務(wu)完成等(deng)功能。

  5. CompletableFuture 工廠方法:除了 supplyAsync() 方法外,CompletableFuture 還提供了一系列工廠方法來創建 CompletableFuture 對象,如 runAsync(), completedFuture(), failedFuture() 等(deng),方便快速創建并管(guan)理異步任務(wu)。

總的來說,CompletableFuture 的(de)實現基于 Future 和(he)(he) CompletionStage 接(jie)口,利用(yong)線程池、回調函數(shu)、異常處理(li)、組合操作等機制,提供(gong)了強大(da)而(er)靈活的(de)異步編程功能,使得開發人(ren)員能夠更加方便地處理(li)異步任務的(de)執行(xing)和(he)(he)結果處理(li)。

使用方法(一)鏈式

如果(guo)我們(men)的業務方(fang)法(fa)已經(jing)寫完(wan)了,這時可以直接通過supplyAsync方(fang)法(fa)來(lai)調用這些已知的方(fang)法(fa),而(er)不需要重新開(kai)發

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();

使用方法(二)獨立方法

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

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

// 并行計算時,響應時間是2和3秒之中最大值,即3秒
@GetMapping("/hello-world2")
public CompletableFuture<String> helloWorld2() {
    CompletableFuture<String> task1Result = parallelTaskService.task1();
    CompletableFuture<String> task2Result = parallelTaskService.task2();

    // 等待所有任務都完成
    CompletableFuture<Void> allOf = CompletableFuture.allOf(task1Result, task2Result);

    // 處理所有任務完成后的邏輯
    return allOf.thenApply(voidResult -> {
        String result = task1Result.join() + " | " + task2Result.join();
        return result;
    });
}
posted @ 2024-05-06 13:40  張占嶺  閱讀(713)  評論(0)    收藏  舉報