JavaのCompletableFutureとFutureの違いとは?非同期処理をサンプルコードで解説
Javaでは、CompletableFuture<T>クラスがFuture<T>インターフェースを実装しています。CompletableFutureは、明示的に完了状態としたFutureとして扱うことができます。
Futureインターフェースは提供される機能が限られており、非同期計算の結果を取得するにはget()メソッドを使うしかありません。get()は結果が返るまで現在のスレッドをブロック(待機)してしまうため、複数の依存関係にあるタスクをノンブロッキングで実行することはできません。
一方、CompletableFutureクラスには、非同期で実行される複数の依存タスクを連結(チェーン)する機能が備わっています。これにより、「前のタスクの結果が利用可能になった時点で次のタスクが起動される」という一連の処理フローを、簡潔かつ柔軟に記述できます。
構文
public class CompletableFuture<T> extends Object implements Future<T>, CompletionStage<T>
サンプルコード
import java.util.function.Supplier;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class CompletableFutureTest {
public static void main(String args[]) throws ExecutionException, InterruptedException {
Calculator calc = new Calculator(4, 7);
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(calc);
future.thenAccept(result -> {
System.out.println(result);
});
System.out.println("CompletableFutureTest End.... ");
Thread.sleep(10000);
}
}
// Calculatorクラス
class Calculator implements Supplier<Integer> {
private int x, y;
public Calculator(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public Integer get() {
try {
Thread.sleep(3000);
} catch(InterruptedException e) {
e.printStackTrace();
}
return x + y;
}
}
実行結果
CompletableFutureTest End....
11
コードのポイント
- supplyAsync():Supplierを引数に受け取り、ForkJoinPoolの共通スレッドプール上で計算を非同期に実行します。
- thenAccept():非同期処理が完了したタイミングで結果を受け取り、後続の処理を実行します。メインスレッドはブロックされません。
- サンプルでは、Calculatorが3秒スリープした後に 4 + 7 = 11 を返します。そのため、先に「CompletableFutureTest End....」が出力され、完了後に「11」が表示されます。
-
【Java】CollectionインターフェースとCollectionsクラスの違いとは?違いを徹底解説
はじめにJavaのコレクションフレームワークを学んでいると、「Collection」と「Collections」という名前が似ている2つの存在に出会います。名前はほぼ同じですが、その役割はまったく異なります。この記事では、両者の違いをわかりやすく解説します。CollectionとCollectionsの主な違いCollectionはJavaにおけるインターフェースです。一方、Collectionsはユーティリティクラスであり、コレクションを操作するための便利な静的メソッドを提供します。Set、List、QueueなどはCollectionインターフェースのサブインターフェースです。また、Map
-
Javaのwait()メソッドとsleep()メソッドの違いを徹底解説
Javaのマルチスレッドプログラミングでは、sleep()メソッドとwait()メソッドのどちらもスレッドの処理を一時停止させるために使用されますが、両者にはいくつかの重要な違いがあります。本記事では、それぞれの特徴と相違点をわかりやすく解説します。 sleep()メソッドとwait()メソッドの主な違い 1. メソッドの種類と影響範囲 sleep()メソッドはThreadクラスのstatic(静的)メソッドであり、呼び出すと現在実行中のスレッドを「実行不可能(Non-Runnable)」状態にします。 一方、wait()メソッドはインスタンスメソッドであり、スレッドオブジェクトではなく対象の