あ 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 メソッドは次のとおりです。
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; } }
出力:
CompletableFuture の例外処理
5 つの CF を表す次の図を考えてみましょう。
5 つの CF が実行中で、CF21 が例外を生成すると、依存するすべての CF (CF31 および CF41) がエラーになります。だということだ:
- isCompletedExceptionally() メソッドの呼び出しは true を返します。
- get() を呼び出すと ExecutionException がスローされ、ルート例外が発生します。
例外を備えた CF30 を作成した次の図を考えてみましょう。
CF21 が正常に実行されると、CF30 は値を送信するだけです。例外が発生した場合、CF30 はそれを処理し、CF31 の値を生成します。
例外を処理するには 3 つの方法があります。
int から文字列 Java へ
public CompletableFuture exceptionally(Function function); public CompletableFuture hadle(BiFunction bifunction); public CompletableFuture whenComplete(BiConsumer action);