Home >Java >javaTutorial >How can CompletionService be used to optimize waiting for a list of futures and handle exceptions efficiently?
Optimizing Future List Waiting with CompletionService
When working with a list of futures, it's essential to efficiently wait for their completion or handle exceptions to prevent unnecessary delays.
Suppose you have the following method that returns a list of futures:
List<Future<O>> futures = getFutures();
To wait for completion or catch exceptions, a naive approach might be:
wait() { for(Future f : futures) { try { f.get(); } catch(Exception e) { //Specific exception handling //Exception in a future, stop waiting return; } } }
However, this approach waits for each future regardless of exceptions in previous futures.
A solution is to employ a CompletionService to receive futures as they become available. If an exception occurs, you can cancel other tasks:
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; } }
In this approach, tasks are submitted to the executor, and completed tasks are received through the completion service. If an exception occurs in a received task, the while loop terminates, and you can cancel any remaining tasks using the executor's shutdownNow() method.
The above is the detailed content of How can CompletionService be used to optimize waiting for a list of futures and handle exceptions efficiently?. For more information, please follow other related articles on the PHP Chinese website!