ホームページ >Java >&#&チュートリアル >複数の Future を効率的に待機して例外を処理する方法: CompletionService と個別の Future チェック?
Future のリストを待機するための最適な実装
非同期プログラミングには、応答性の向上やリソースの効率的な使用などの利点があります。ただし、複数の Future を同時に管理すると、それらの完了を調整したり、例外を効率的に処理したりする際に課題が生じる可能性があります。この記事では、リスト内のすべての Future が完了するまで待機するか、いずれかの Future で例外が発生するまで待機するという問題の解決策を検討します。
簡単なアプローチでは、Future.get() を使用して各 Future を個別にチェックします。ただし、この方法は、前のタスクでエラーが発生した場合でも、すべての Future が完了するまで待機する必要があるため、大きなリストの場合は非効率になります。
代替ソリューションは、CompletionService を使用することです。このサービスは、呼び出し元が完成したフューチャーが利用可能になったときにそれを受信できるようにするブロッキング take() メソッドを提供します。同時に、エラーが発生した場合に進行中のタスクをキャンセルできます。
次の実装を考えてみましょう:
<code class="java">Executor executor = Executors.newFixedThreadPool(4); CompletionService<SomeResult> completionService = new ExecutorCompletionService<SomeResult>(executor); // Submit 4 tasks for (int i = 0; i < 4; i++) { completionService.submit(new Callable<SomeResult>() { public SomeResult call() { ... // Task logic return result; } }); } int received = 0; boolean errors = false; // Monitor future completion and errors while (received < 4 && !errors) { Future<SomeResult> resultFuture = completionService.take(); // Blocks if no futures available try { SomeResult result = resultFuture.get(); received++; ... // Process result } catch (Exception e) { // Log error errors = true; } }</code>
この実装では、CompletionService は take() メソッドを通じて完了した Future を受け取ります。 。いずれかのタスクが例外をスローすると、エラー フラグが true に設定され、ループが終了します。このアプローチにより、後続のタスクの待機時間が大幅に短縮され、より効率的な例外処理が可能になります。
必要に応じて、エラー発生時に未処理のタスクをキャンセルして、リソースがすぐに解放されるようにすることで、このソリューションを強化できます。
以上が複数の Future を効率的に待機して例外を処理する方法: CompletionService と個別の Future チェック?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。