実行結果を取得するための CompletableFuture メソッド

参加する()

CompletableFuture.join() は、非同期タスクの完了を待機して結果を取得するために使用されるメソッドです。

        CompletableFuture.join() メソッドを使用する場合、非同期タスクが完了している場合、メソッドはタスクの実行結果をすぐに返します。非同期タスクが完了していない場合、メソッドはタスクが実行されるまで現在のスレッドをブロックします。が完了し、結果が返されます。

以下は、CompletableFuture.join() メソッドの詳細な紹介です。

メソッド宣言: public T join()

メソッドの説明: この CompletableFuture の完了を待って、結果を返します。

メソッドの戻り値: この CompletableFuture の結果。

メソッドによってスローされる例外: この CompletableFuture の計算中に例外が発生した場合は CompletionException。

        たとえば、リモート サービスにアクセスして文字列の結果を返す必要がある非同期タスクがあるとします。以下の例に示すように、CompletableFuture を使用してこの非同期タスクを実装し、CompletableFuture.join() メソッドを使用してタスクの実行の完了を待機して結果を取得できます。

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    // 访问远程服务并返回结果
});

// 等待异步任务完成并获取结果
String result = future.join();

        上記の例では、最初に CompletableFuture オブジェクトを作成しました。supplyAsync() メソッドを使用して、リモート サービスにアクセスして結果を返す非同期タスクを指定しました。次に、CompletableFuture.join() メソッドを使用して、タスクの実行が完了して結果を取得するのを待ちます。タスクの実行が完了すると、 join() メソッドはすぐにタスクの実行結果を返すため、タスクの実行結果を時間内に取得できます。

        つまり、CompletableFuture.join() は CompletableFuture クラスの重要なメソッドであり、非同期タスクの完了を待機して結果を取得するために使用できます。CompletableFuture で非同期タスクの実行結果を取得する必要がある場合は、join() メソッドを使用してこの操作を完了できます。join() メソッドを使用するときは、プログラムが正常に実行されるように、スレッドのデッドロックや無限ブロックを防ぐように注意する必要があることに注意してください。

スレッドのデッドロックや無限ブロッキングを防ぐ方法

同じスレッド内に join() メソッドをネストしないでください

        join() メソッドがスレッド内にネストされている場合、join() メソッドは現在のスレッドをブロックし、非同期タスクが完了するまで待機するため、スレッドのデッドロックの問題が発生する可能性があります。この状況を回避するには、同じスレッドにネストされた join() メソッドの呼び出しを避け、非同期タスクをスレッド プールに送信して実行する必要があります。

CompletableFuture.getNow() メソッドを使用して結果を取得します

        CompletableFuture の実行結果を取得したいが、現在のスレッドをブロックしたくない場合は、CompletableFuture.getNow() メソッドを使用して結果を取得できます。このメソッドは CompletableFuture の結果をすぐに返します。結果がまだ計算されていない場合はデフォルト値を返します。

タイムアウトを設定する

        指定された時間内に非同期タスクを完了できない場合、join() メソッドは常に現在のスレッドをブロックし、プログラムが無限待機状態に陥る可能性があります。したがって、join() メソッドを使用する場合は、CompletableFuture.orTimeout() メソッドと CompletableFuture.get(timeout,unit) メソッドを使用してタイムアウト期間を設定できます。指定した時間が経過しても結果が取得されない場合は、例外が発生します。投げられた。

        CompletableFuture.orTimeout() メソッドは Java 9 で導入されました。CompletableFuture の最大待機時間を設定できます。指定された時間内に CompletableFuture が計算を完了しない場合、TimeoutException がスローされます。例は次のとおりです。

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    // 访问远程服务并返回结果
});

// 设置最大等待时间为1秒
String result = future.orTimeout(1, TimeUnit.SECONDS).join();

        上記の例では、最初に CompletableFuture オブジェクトを作成し、supplyAsync() メソッドを使用して非同期タスクを指定します。次に、orTimeout() メソッドを呼び出して CompletableFuture の最大待ち時間を 1 秒に設定し、join() メソッドを使用して非同期タスクの実行の完了を待って結果を取得します。タスクが 1 秒以内に完了しない場合、orTimeout() メソッドは TimeoutException 例外をスローして、プログラムが待機中の操作を時間内に終了できるようにします。 

CompletableFuture.completeExceptionally() メソッドを使用して例外を処理する

        CompletableFuture を使用すると、非同期タスクでネットワーク例外やタイムアウトなどのさまざまな異常状態が発生する可能性があります。これらの例外が処理されない場合、プログラム エラーが発生したり、無限待機状態に陥ったりする可能性があります。この状況を回避するには、CompletableFuture.completeExceptionally() メソッドを使用して例外を処理し、呼び出し元に時間内に通知します。

        要約すると、CompletableFuture.join() メソッドを使用するときは、スレッドのデッドロックや無限ブロックを防ぐように注意する必要があります。上記の対策を講じることで、この状況の発生を回避し、プログラムが正常に実行されるようにすることができます。

CompletableFuture.get()

        CompletableFuture.get() メソッドはブロッキング メソッドであり、CompletableFuture が計算を完了して結果を返すまで現在のスレッドをブロックします。CompletableFuture の計算中に例外が発生した場合、get() メソッドは元の例外を原因として ExecutionException をスローします。

CompletableFuture.get() メソッドには 2 つのオーバーロード形式があります。

得る()

このメソッドは、CompletableFuture が計算を完了して結果を返すまで、現在のスレッドをブロックします。例は次のとおりです。

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    // 访问远程服务并返回结果
});

// 阻塞当前线程,直到 CompletableFuture 返回结果
String result = future.get();

        上記の例では、最初に CompletableFuture オブジェクトを作成し、supplyAsync() メソッドを使用して非同期タスクを指定します。次に、get() メソッドを呼び出して現在のスレッドをブロックし、CompletableFuture が計算を終了して結果を返すのを待ちます。

get(タイムアウト、ユニット)

        このメソッドを使用すると、最大待機時間を設定できます。CompletableFuture が指定された待機時間内に計算を完了しない場合、TimeoutException がスローされます。例は次のとおりです。

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    // 访问远程服务并返回结果
});

try {
    // 最大等待时间为1秒
    String result = future.get(1, TimeUnit.SECONDS);
} catch (TimeoutException e) {
    // 处理超时异常
} catch (InterruptedException | ExecutionException e) {
    // 处理其他异常
}

        上記の例では、最初に CompletableFuture オブジェクトを作成し、supplyAsync() メソッドを使用して非同期タスクを指定します。次に、get(timeout,unit) メソッドを呼び出して最大待機時間を 1 秒に設定し、CompletableFuture が計算を完了して結果を返すまで、または待機時間がタイムアウトになるまで、現在のスレッドをブロックします。

        get(timeout,unit) メソッドは、CompletableFuture の計算が完了するか待機時間がタイムアウトになるまで、現在のスレッドをブロックすることに注意してください。したがって、このメソッドを使用する場合は、メイン スレッドでの呼び出しを避け、非同期操作を最大限に活用するために CompletableFuture をスレッド プールに送信して実行する必要があります。

getNow(T値)

        CompletableFuture.getNow(T value) メソッドはノンブロッキング メソッドで、CompletableFuture が計算を完了する前にデフォルト値を返し、CompletableFuture が計算を完了した場合は計算結果を返します。このメソッドには、デフォルト値を表すパラメーターが 1 つあります。

例は次のとおりです。

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    // 访问远程服务并返回结果
});

// 在 CompletableFuture 完成计算之前返回默认值,如果 CompletableFuture 已经完成计算,则返回计算结果
String result = future.getNow("default value");

        上記の例では、最初に CompletableFuture オブジェクトを作成し、supplyAsync() メソッドを使用して非同期タスクを指定します。次に、getNow() メソッドを呼び出して CompletableFuture の計算結果を取得するか、CompletableFuture が計算を完了する前にデフォルト値を返します。CompletableFuture が計算を完了した場合は計算結果を返し、CompletableFuture が計算を完了していない場合はデフォルト値を返します。

        getNow() メソッドはノンブロッキング メソッドであり、結果をすぐに返すことができますが、結果の正確性は保証されないことに注意してください。したがって、この方法を使用する場合は、プログラムの正確性を保証するために適切なロジック処理を追加する必要があります。

終わらせる()

        CompletableFuture.isDone() メソッドは、CompletableFuture が計算を完了したかどうかを判断するために使用されます。CompletableFuture が計算を完了した場合は true を返し、それ以外の場合は false を返します。

例は次のとおりです。

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    // 访问远程服务并返回结果
});

// 判断 CompletableFuture 是否已经完成计算
boolean done = future.isDone();

        上記の例では、最初に CompletableFuture オブジェクトを作成し、supplyAsync() メソッドを使用して非同期タスクを指定します。次に、isDone() メソッドを呼び出して、CompletableFuture が計算を完了したかどうかを判断し、計算結果を取得します。CompletableFuture が計算を完了した場合は true を返し、それ以外の場合は false を返します。

        isDone() メソッドは CompletableFuture が計算を完了したかどうかを確認するためにのみ使用でき、CompletableFuture が計算を完了するのを待つためには使用できないことに注意してください。CompletableFuture が計算を終了して結果を取得するのを待つには、CompletableFuture.join() メソッドまたは CompletableFuture.get() メソッドを使用できます。

完了(T値) 

        CompletableFuture.complete(T value) メソッドは、CompletableFuture 計算を手動で完了するために使用されるメソッドです。このメソッドには、計算の結果値を表すパラメーターが 1 つあります。

例は次のとおりです。

CompletableFuture<String> future = new CompletableFuture<>();

// 手动完成 CompletableFuture 计算并设置计算结果
future.complete("result");

// 获取 CompletableFuture 的计算结果
String result = future.join();

        上の例では、最初に CompletableFuture オブジェクトを作成し、コンストラクターを使用して不完全な CompletableFuture を作成します。次に、CompletableFuture の計算を手動で完了し、complete() メソッドを呼び出して計算結果を設定します。

        CompletableFuture が計算を完了している場合、complete() メソッドを再度呼び出すと例外がスローされることに注意してください。したがって、complete() メソッドを呼び出す前に、isDone() メソッドを使用して CompletableFuture の計算が完了したかどうかを判断する必要があります。

おすすめ

転載: blog.csdn.net/Ascend1977/article/details/130941643