在 Java 中非同步呼叫方法

Muhammad Zeeshan 2023年10月12日
  1. 使用 Thread 非同步呼叫 Java 中的方法
  2. 在 Java 中使用 FutureTask 非同步呼叫方法
  3. 在 Java 中使用 CompletableFuture 非同步呼叫方法
  4. 使用 EA Async 非同步呼叫 Java 中的方法
  5. 使用 Cactoos 庫非同步呼叫 Java 中的方法
在 Java 中非同步呼叫方法

在本文中,我們將學習如何在 Java 中非同步呼叫函式。

首先,我們將瞭解一些 Java 內建的非同步程式設計工具,例如 FutureTask 和 CompletableFuture。然後我們將瞭解一些提供開箱即用解決方案的庫,例如 EA Async 和 Cactoos。

使用 Thread 非同步呼叫 Java 中的方法

我們可以開始一個新執行緒來執行任何非同步操作。它更容易理解。

讓我們建立一個新增兩個整數並列印結果的新執行緒:

class example {
  public static void main(String[] args) {
    int num1 = 4;
    int num2 = 5;
    int result = num1 + num2;
    Thread T = new Thread(
        () -> { System.out.println("Addition of " + num1 + " and " + num2 + " is " + result); });
    T.start();
  }
}

在 Java 中使用 FutureTask 非同步呼叫方法

Future 介面允許你使用 FutureTask 執行非同步操作。我們可以使用 ExecutorService 的 submit 方法來非同步執行專案並返回一個 FutureTask 物件。

例如,這裡是如何找到一個數字的階乘:

int num1 = 9;

ExecutorService tp = Executors.newCachedThreadPool();
Future<double> futureTask = tp.submit(() -> factorial(num1));

while (!futureTask.isDone()) {
  System.out.println("Still processing the task");
}
double result = futureTask.get();
tp.shutdown();

我們使用了 Future 介面的 isDone 功能來檢視工作是否已經完成。之後,我們使用 get 方法獲取結果。

在 Java 中使用 CompletableFuture 非同步呼叫方法

作為 FutureCompletionStage 的混合體,CompletableFuture 是在 Java 8 中引入的。它具有非同步程式設計技術,例如 supplyAsyncrunAsyncthenApplyAsync

CompletionStage 是一個承諾。它保證計算將在某個時候完成。

CompletionStage 很有用,因為它提供了幾種方法來附加要在階段完成時執行的回撥。

讓我們從頭開始,做一個簡單的非同步計算。

在 Java 中使用 supplyAsyncCompletableFuture 非同步呼叫方法

CompletableFuture.supplyAsync(this::sendMsg);

就這麼簡單,supplyAsync 函式接受包含非同步程式碼的供應商。我們希望在本例中使用 sendMsg 函式。

在 Java 中使用 thenAcceptCompletableFuture 非同步呼叫方法

CompletableFuture.supplyAsync(this::sendMsg).thenAccept(this::notify);

在第一個示例中,我們執行 sendMsg 以非同步傳送訊息。所以讓我們新增一個回撥來提醒我們訊息的傳遞狀態。

可以通過多種方式引入回撥;一種方法是使用 thenAccept。在此示例中,它需要通知使用者一旦完成就處理先前計算的結果。

使用 EA Async 非同步呼叫 Java 中的方法

這是 Java 的另一個特性,它允許你逐步編寫非同步程式碼,從而使程式設計和擴充套件變得更加容易。Electronic Arts 是 async-await 功能的建立者,該功能可通過 ea-async 包在 Java 環境中使用。

此功能轉換執行時程式碼並重寫 await 方法呼叫,與 completeableFuture 相當。

所以我們可以使用被稱為 await 方法的 EA-sync 方法來實現上述 completeableFuture 程式碼,方法是呼叫 Async.init 函式來初始化 Async 執行時。

在這裡,我們將使用 EA 的 Async 類提供的 await 函式來修改前面描述的 CompletableFuture 程式碼:

static {
  Async.init();
}

為了設定 Async 執行時分析,我們使用 Async.init 函式作為靜態函式。

public double example2(int num1) {
  CompletableFuture<double> cf = CompletableFuture.supplyAsync(() -> factorial(num1));
  double result = Async.await(cf);
}

在執行時,async 函式會更改程式碼並重寫 await 方法呼叫以類似地操作,利用 CompletableFuture 鏈。

使用 Cactoos 庫非同步呼叫 Java 中的方法

對於非同步任務,這個庫提供了一個 Async 類。Cactoos 庫具有廣泛的曲目,從文字操作到資料結構。

該庫的原始型別和功能與其他庫(如 Guava 和 Apache Commons)提供的類似,儘管它們更側重於物件導向的設計概念。

在這裡,使用 Cactoos 的 Async 類的一個例項,我們將找到一個數字的階乘。

Async<Integer, Double> a = new Async<Integer, Double>(inputdata -> factorial(inputdata));
Future<Double> asyncFuture = a.apply(num1);
Double result = asyncFuture.get();

apply 函式使用 ExecutorService.submit 方法執行並返回一個 Future 介面物件。Cactoos 庫提供的類執行與 Apache Commons 庫中的靜態方法相同的功能。

Muhammad Zeeshan avatar Muhammad Zeeshan avatar

I have been working as a Flutter app developer for a year now. Firebase and SQLite have been crucial in the development of my android apps. I have experience with C#, Windows Form Based C#, C, Java, PHP on WampServer, and HTML/CSS on MYSQL, and I have authored articles on their theory and issue solving. I'm a senior in an undergraduate program for a bachelor's degree in Information Technology.

LinkedIn

相關文章 - Java Method