今週私が学んだのは: CompletableFuture – 非同期プログラミングへの Java のアプローチ

WBOY
リリース: 2024-08-01 06:51:43
オリジナル
850 人が閲覧しました

This Week I Learnt: CompletableFuture – Java

今週は、Java の CompletableFuture について詳しく説明します。

フロントエンドのバックグラウンドを持つフルスタック開発者として、ネットワークリクエストやバックグラウンド計算などの非同期タスクを扱うことは私の役割の避けられない部分です。 Java では、CompletableFuture は、メインスレッドの応答性を維持しながらこれらのタスクを処理するための強力なツールです。

Java にとっての完全な Future は、JavaScript にとっての Promise と同じです。

JavaScript に精通している場合は、両方の言語を比較してこれらの概念を理解するのに役立つかもしれません。私は CompletableFuture を Promise の Java 版と考えるのが好きです。これは、非同期操作の最終的な結果 (結果が成功か失敗か) を表すクラスです。 Java 8 で java.util.concurrent パッケージの一部として導入されたこれは、Promises と同様に、操作を連鎖させたりエラーを処理したりするメソッドを備えた、ノンブロッキング コードを記述する強力な方法です。

ここで 2 つの簡単な比較を示します:

// JavaScript Promise
fetchFromServer()
    .then(data => processData(data))
    .then(result => updateUI(result))
    .catch(error => handleError(error));
ログイン後にコピー
// Java CompletableFuture
CompletableFuture.supplyAsync(() -> fetchDataFromServer())
    .thenApply(data -> processData(data))
    .thenAccept(result -> updateUI(result))
    .exceptionally(error -> handleError(error));
ログイン後にコピー

上に示したように、CompletableFuture は、クリーンで読みやすい非同期コードを可能にする、同様のチェーン可能な構文を提供します。

ユーザーのプロフィール データと注文履歴を 2 つの別個のエンドポイントから取得する必要があるシナリオを考えてみましょう。これらのリクエストが完了するのを待っている間に UI がフリーズすることは避けたいでしょう。 CompletableFuture を使用してこれを実装する方法は次のとおりです:

CompletableFuture<User> profileFuture = CompletableFuture.supplyAsync(() -> {
    // Fetch user profile from a service
});

CompletableFuture<List<Order>> ordersFuture = CompletableFuture.supplyAsync(() -> {
    // Fetch user orders from another service
});

CompletableFuture<Void> combinedFuture = CompletableFuture.allOf(profileFuture, ordersFuture);

combinedFuture.thenRun(() -> {
    User user = userFuture.join(); 
    List<Order> orders = ordersFuture.join(); 
    displayUserData(user, orders); 
});
ログイン後にコピー

この例では、2 つの非同期リクエストを同時にトリガーし、allOf を使用して両方が終了するのを待ちます。完了したら、メインスレッドをブロックすることなく、結果を取得し、それに応じて UI を更新します。


連鎖と完成段階

CompletableFuture は、連鎖操作の基盤を提供する CompletionStage インターフェイスを実装します。 thenApply、thenAccept、および同様のメソッドはそれぞれ別の CompletionStage を返し、複雑な非同期パイプラインを作成できます。

一連の非同期タスクを次々に実行する場合に、JavaScript で Promise を連鎖させる方法と同様に、コールバック地獄に陥ることなく、依存する非同期操作のシーケンスを作成するために、Completable Future 内でタスクを連鎖させることができます。 。その方法は次のとおりです:

CompletableFuture.supplyAsync(() -> "Hello")
    .thenApply(result -> result + ", CompletableFuture")
    .thenApply(result -> result + " in Java")
    .thenAccept(System.out::println);
ログイン後にコピー

例外の処理

Promise オブジェクトには .catch() がありますが、Completable Future には .Exceptionally() があります。このメソッドは、非同期処理中に発生する可能性のある例外を処理します:

CompletableFuture.supplyAsync(() -> {
    if (true) {
        throw new RuntimeException("Exception in CompletableFuture!");
    }
    return "No exception";
}).exceptionally(ex -> {
    System.out.println("Handled exception: " + ex);
    return "Recovered value";
}).thenAccept(System.out::println);
ログイン後にコピー

この記事が CompletableFuture クラスをさらに詳しく調べるための良い出発点になれば幸いです。

役立つリンク:

  • 同時実行性の詳細: CompletableFuture のガイド
  • Java での非同期プログラミングの包括的な入門 — Promise、コールバック、および Futures

以上が今週私が学んだのは: CompletableFuture – 非同期プログラミングへの Java のアプローチの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!