Java で CompletableFuture を使用して、すべての要素が処理されたときに通知する方法

王林
リリース: 2023-06-26 15:57:11
オリジナル
851 人が閲覧しました

Java の

CompletableFuture は非常に強力な非同期プログラミング ツールであり、非同期処理中にタスクの配信、処理、通知などの操作を実行するのに役立ち、非同期プログラミングの難しさを大幅に簡素化します。 CompletableFutureを非同期処理に使用する場合、すべての要素の処理が完了したら通知する必要があるシナリオがありますが、この記事ではそれを実現するためにJavaでCompletableFutureを使用する方法を紹介します。

まず、CompletableFuture の基本概念と使用法を理解する必要があります。 CompletableFuture は、操作を非同期に実行するときに結果を処理する方法を提供する Java 8 の新しいクラスです。これにより、複数の非同期操作をより複雑な操作に結合し、すべての非同期操作が完了するのを待ってから次のステップに進むことができます。

すべての要素が処理されたときに通知するシナリオでは、CompletableFuture: allOf のメソッドを使用する必要があります。このメソッドは、複数の CompletableFuture オブジェクトを結合し、すべてのオブジェクトの非同期タスクが完了するのを待った後に新しい CompletableFuture オブジェクトを返すことができます。

allOf メソッドを使用する基本的な手順は次のとおりです。

  1. さまざまな要素を処理するために、複数の CompletableFuture オブジェクトを作成します。
  2. CompletableFuture.allOf メソッドを呼び出し、すべての CompletableFuture オブジェクトをパラメータとして渡し、すべての非同期タスクが完了するまで待ちます。
  3. すべての非同期タスクが完了すると、allOf メソッドは新しい CompletableFuture オブジェクトを返し、次の処理に使用できます。

以下では、例を使用して、CompletableFuture を使用して、すべての要素が上記の手順に従って処理されたときに通知する方法を示します。

まず、非同期タスクの処理をシミュレートするための Task クラスを定義する必要があります。サンプル コードは次のとおりです。

import java.util.concurrent.CompletableFuture;

public class Task {
    public CompletableFuture<String> process(String element) {
        CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
            // 模拟异步任务的处理过程
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return element.toUpperCase();
        });
        return future;
    }
}
ログイン後にコピー

上記のコードでは、Task クラスは、各要素を処理して CompletableFuture オブジェクトを返す process メソッドを定義します。このメソッドでは、CompletableFuture.supplyAsync メソッドを使用して非同期タスクの処理をシミュレートし、要素を大文字に変換して返します。同時に、時間のかかる非同期タスクのプロセスをシミュレートするために、タスクに 1 秒間のスリープを追加しました。

次に、Main クラスを定義し、それを Task クラスおよび CompletableFuture と組み合わせて使用​​して、すべての要素が処理されたときに通知します。サンプル コードは次のとおりです。

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;

public class Main {
    public static void main(String[] args) {
        List<String> elements = new ArrayList<>();
        elements.add("hello");
        elements.add("world");
        elements.add("java");

        Task task = new Task();
        List<CompletableFuture<String>> futures = new ArrayList<>();

        // 遍历每个元素,并将它们的处理结果封装成一个CompletableFuture对象
        for (String element : elements) {
            CompletableFuture<String> future = task.process(element);
            futures.add(future);
        }

        // 等待所有异步任务完成,将它们的处理结果打印出来
        CompletableFuture<Void> allFutures = CompletableFuture.allOf(futures.toArray(new CompletableFuture[futures.size()]));
        allFutures.thenRun(() -> {
            System.out.println("所有异步任务已完成:");

            for (CompletableFuture<String> future : futures) {
                try {
                    String result = future.get();
                    System.out.println(result);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
}
ログイン後にコピー

上記のコードでは、すべての要素を保存するための List を定義し、次に Task オブジェクトを作成し、各要素を走査し、その処理結果を CompletableFuture オブジェクトにカプセル化し、これらを保存します。オブジェクトをリストに追加します。次に、CompletableFuture.allOf メソッドを使用してすべての非同期タスクが完了するのを待ち、すべてのタスクが完了したら、allOf メソッドによって返された CompletableFuture オブジェクトを通じてすべてのタスクの処理結果を出力します。

上記のプログラムを実行すると、次の出力が表示されます。

所有异步任务已完成:
HELLO
WORLD
JAVA
ログイン後にコピー

上記のプログラムの実行結果は、すべての非同期タスクが処理され、各要素が大文字に変換されたことを示しています。 . .同時に、すべての要素の処理が完了したことを通知する機能も実装することに成功しました。

要約すると、CompletableFuture を使用してすべての要素が処理されたときに通知する方法は次のとおりです。

  1. さまざまな要素を処理するために複数の CompletableFuture オブジェクトを作成します。
  2. CompletableFuture.allOf メソッドを呼び出し、すべての CompletableFuture オブジェクトをパラメータとして渡し、すべての非同期タスクが完了するまで待ちます。
  3. すべての非同期タスクが完了すると、allOf メソッドは新しい CompletableFuture オブジェクトを返し、次の処理に使用できます。

一般に、CompletableFuture は、複数の非同期タスクを結合し、すべてのタスクが完了したときに通知するのに役立つ、非常に便利な非同期プログラミング ツールです。実際の開発では、上記の実装方法と実際のビジネス シナリオに基づいて、CompletableFuture をより適切に使用して、コードの同時実行性と実行効率を向上させることができます。

以上がJava で CompletableFuture を使用して、すべての要素が処理されたときに通知する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート