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 サイトの他の関連記事を参照してください。