Javaで非同期的にメソッドを呼び出す
-
Java で
Thread
を使用してメソッドを非同期的に呼び出す -
Java で
FutureTask
を使用してメソッドを非同期的に呼び出す -
Java で
CompletableFuture
を使用してメソッドを非同期的に呼び出す -
Java で
EA Async
を使用してメソッドを非同期的に呼び出す - Java で Cactoos ライブラリを使用してメソッドを非同期的に呼び出す
この記事では、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
を使用してメソッドを非同期的に呼び出す
Future
と CompletionStage
のハイブリッドとして、CompletableFuture
が Java 8 に導入されました。これには、supplyAsync
、runAsync
、thenApplyAsync
などの非同期プログラミング手法があります。
CompletionStage
は約束です。ある時点で計算が完了することを保証します。
CompletionStage
は、ステージの完了時に実行されるコールバックをアタッチするためのいくつかのメソッドを提供するため、便利です。
最初から始めて、簡単な非同期計算を行いましょう。
Java で supplyAsync
と CompletableFuture
を使用してメソッドを非同期的に呼び出す
CompletableFuture.supplyAsync(this::sendMsg);
それと同じくらい簡単ですが、supplyAsync
関数は非同期コードを含むサプライヤーを受け入れます。この例では、sendMsg
関数を使用します。
Java で thenAccept
と CompletableFuture
を使用してメソッドを非同期的に呼び出す
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 ライブラリにある静的メソッドと同じ機能を実行するクラスを提供します。
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