ホームページ  >  記事  >  Java  >  CompletionService を使用して、Future リストの待機を最適化し、例外を効率的に処理するにはどうすればよいでしょうか?

CompletionService を使用して、Future リストの待機を最適化し、例外を効率的に処理するにはどうすればよいでしょうか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-25 19:58:29923ブラウズ

How can CompletionService be used to optimize waiting for a list of futures and handle exceptions efficiently?

CompletionService による Future リストの待機の最適化

Future のリストを操作するときは、Future のリストの完了を効率的に待機したり、例外を処理したりすることが重要です。不必要な遅延を防ぎます。

Future のリストを返す次のメソッドがあるとします。

List<Future<O>> futures = getFutures();

完了を待つか例外をキャッチするには、単純なアプローチは次のようになります。

wait() {
  for(Future f : futures) {
    try {
      f.get();
    } catch(Exception e) {
       //Specific exception handling
       //Exception in a future, stop waiting
       return;
    }
  }
}

ただし、このアプローチは、前の Future の例外に関係なく、各 Future を待ちます。

解決策は、CompletionService を使用して、Future が利用可能になったときに受け取ることです。例外が発生した場合は、他のタスクをキャンセルできます。

Executor executor = Executors.newFixedThreadPool(4);
CompletionService<SomeResult> completionService = new ExecutorCompletionService<SomeResult>(executor);

//Submit tasks
for(int i = 0; i < 4; i++) {
  completionService.submit(() -> {
    ...
    return result;
  });
}

int received = 0;
boolean errors = false;

while(received < 4 && !errors) {
  Future<SomeResult> resultFuture = completionService.take(); //Blocks if none available
  try {
    SomeResult result = resultFuture.get();
    received++;
    ... //Process result
  } catch(Exception e) {
    //Log and set error flag
    errors = true;
  }
}

このアプローチでは、タスクは実行者に送信され、完了したタスクは完了サービスを通じて受信されます。受信したタスクで例外が発生した場合、while ループは終了し、エグゼキューターの shutdownNow() メソッドを使用して残りのタスクをキャンセルできます。

以上がCompletionService を使用して、Future リストの待機を最適化し、例外を効率的に処理するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。