logo

CompletableFutureとは何ですか?

CompltableFuture 非同期プログラミングに使用されます。非同期プログラミングとは、ノンブロッキング コードを記述することを意味します。メイン アプリケーション スレッドとは別のスレッドでタスクを実行し、メイン スレッドに進行状況、完了、または失敗を通知します。

このようにして、メインスレッドはタスクをブロックしたり、タスクの完了を待機したりしません。他のタスクは並行して実行されます。並列処理によりプログラムのパフォーマンスが向上します。

CompletableFuture は Java のクラスです。これは java.util.cocurrent パッケージに属します。 CompletionStage および Future インターフェイスを実装します。

完成段階

  • アクションを実行し、別の完了ステージが完了すると値を返します。
  • 他のタスクをトリガーする可能性のあるタスクのモデル。

したがって、それはチェーンの要素です。

複数のスレッドが完了 (例外的に完了するか、CompletableFuture をキャンセル) しようとすると、そのうちの 1 つだけが成功します。

Future vs. CompletableFuture

CompletableFuture は、Java 8 で導入された Java の Future API の拡張機能です。

Future は非同期プログラミングに使用されます。 isDone() と get() という 2 つのメソッドが提供されます。これらのメソッドは、計算が完了するとその結果を取得します。

未来の限界

  • 未来は相互に完全になることはできません。
  • ブロックせずに、Future の結果に対してさらにアクションを実行することはできません。
  • Future には例外処理がありません。
  • 複数の先物を組み合わせることはできません。

Future には非常に多くの制限があるため、CompletableFuture が用意されています。 CompletableFuture は、複数の Future の作成、連鎖、結合のための幅広いメソッド セットを提供します。また、包括的な例外処理のサポートもあります。

CompletetableFuture の作成

CompletableFuture は、次の引数なしのコンストラクターを使用することによってのみ作成できます。

 CompletableFuture CompletableFuture = new CompletableFuture(); 

最も頻繁に使用される CompletableFuture メソッドは次のとおりです。

    SupplyAsync():ジョブは非同期で完了します。サプライヤーの結果は、デフォルトとして ForkJoinPool.commonPool() からのタスクによって実行されます。 SupplyAsync() メソッドは、他のメソッドを適用できる CompletableFuture を返します。thenApply():このメソッドは関数を引数として受け取ります。このステージが正常に完了すると、新しい CompletableStage が返されます。新しいステージは、指定された関数の引数として使用されます。参加する():メソッドは完了すると結果値を返します。また、例外的に完了した場合は CompletionException (未チェック例外) をスローします。
 import java.util.Arrays; import java.util.List; import java.util.concurrent.CompletableFuture; public class CompletableFutureExample1 { public static void main(String[] args) { try { List list = Arrays.asList(5,9,14); list.stream().map(num->CompletableFuture.supplyAsync(()->getNumber(num))).map(CompletableFuture->CompletableFuture.thenApply(n- >n*n)).map(t->t.join()).forEach(s->System.out.println(s)); } catch (Exception e) { e.printStackTrace(); } } private static int getNumber(int a) { return a*a; } } 

出力:

Java の CompletableFuture

CompletableFuture の例外処理

5 つの CF を表す次の図を考えてみましょう。

Java の CompletableFuture

5 つの CF が実行中で、CF21 が例外を生成すると、依存するすべての CF (CF31 および CF41) がエラーになります。だということだ:

  • isCompletedExceptionally() メソッドの呼び出しは true を返します。
  • get() を呼び出すと ExecutionException がスローされ、ルート例外が発生します。

例外を備えた CF30 を作成した次の図を考えてみましょう。

Java の CompletableFuture

CF21 が正常に実行されると、CF30 は値を送信するだけです。例外が発生した場合、CF30 はそれを処理し、CF31 の値を生成します。

例外を処理するには 3 つの方法があります。

int から文字列 Java へ
 public CompletableFuture exceptionally(Function function); public CompletableFuture hadle(BiFunction bifunction); public CompletableFuture whenComplete(BiConsumer action);