Javaで非同期的にメソッドを呼び出す

Muhammad Zeeshan 2023年10月12日
  1. Java でThreadを使用してメソッドを非同期的に呼び出す
  2. Java で FutureTask を使用してメソッドを非同期的に呼び出す
  3. Java で CompletableFuture を使用してメソッドを非同期的に呼び出す
  4. Java で EA Asyncを使用してメソッドを非同期的に呼び出す
  5. Java で Cactoos ライブラリを使用してメソッドを非同期的に呼び出す
Javaで非同期的にメソッドを呼び出す

この記事では、Java で関数を非同期的に呼び出す方法を学習します。

まず、FutureTask や CompletableFuture などの Java に組み込まれている非同期プログラミングツールのいくつかを見ていきます。次に、EA Async や Cactoos などのすぐに使えるソリューションを提供するいくつかのライブラリを見ていきます。

Java でThreadを使用してメソッドを非同期的に呼び出す

新しいスレッドを開始して、非同期アクションを実行できます。理解する方が簡単です。

2つの整数を追加し、結果を出力する新しいスレッドを作成してみましょう。

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 を実行してメッセージを非同期で送信しました。それでは、メッセージの配信ステータスを通知するコールバックを追加しましょう。

コールバックはいくつかの方法で導入できます。1つの方法は、thenAccept を使用することです。この例では、前の計算の結果を処理するために、ユーザーに通知する必要があります。

Java で EA Asyncを使用してメソッドを非同期的に呼び出す

これは、非同期コードを段階的に記述できる Java の別の機能であり、プログラミングとスケーリングがはるかに簡単になります。Electronic Arts は、ea-async パッケージを介して Java 環境で利用できる async-await 機能の作成者です。

この機能は、ランタイムコードを変換し、completeableFuture に相当する await メソッド呼び出しを書き直します。

したがって、await メソッドと呼ばれる EA-sync メソッドを使用して、Async.init 関数を呼び出して Async ランタイムを初期化することにより、上記の completeableFuture コードを実装できます。

ここでは、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 関数はコードを変更し、CompletableFuture のチェーンを利用して、同様に動作するように await メソッド呼び出しを書き直します。

Java で Cactoos ライブラリを使用してメソッドを非同期的に呼び出す

非同期タスクの場合、このライブラリは 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