Waiting Efficiently on a List of Futures
When dealing with a list of futures, the goal is to wait until completion or the occurrence of an exception in any future. A naive approach involving individual calls to f.get() can lead to unnecessary waiting if an exception occurs early on.
Avoiding Unnecessary Waiting with CompletionService
To address this issue, the CompletionService class comes into play. It allows asynchronous tasks to be executed and their results to be retrieved in a thread-safe manner as they become available. Here's how to use it:
Executor executor = Executors.newFixedThreadPool(4);
CompletionService completionService = new ExecutorCompletionService(executor);
// Submit tasks to the service
for (int i = 0; i () {
@Override
public SomeResult call() {
// Task logic here
return result;
}
});
}
int received = 0;
boolean errors = false;
// Loop until all tasks are complete or an error occurs
while (received resultFuture = completionService.take(); // Blocks if nothing available
try {
SomeResult result = resultFuture.get();
received ;
// Process result here
} catch (Exception e) {
// Log error
errors = true;
}
}
// Consider canceling remaining tasks if an error occurred
By using the CompletionService approach, you can monitor the completion of tasks in real-time and halt further processing if an error occurs, thus avoiding unnecessary waiting.
Disclaimer: All resources provided are partly from the Internet. If there is any infringement of your copyright or other rights and interests, please explain the detailed reasons and provide proof of copyright or rights and interests and then send it to the email: [email protected] We will handle it for you as soon as possible.
Copyright© 2022 湘ICP备2022001581号-3