使用 CompletionService 优化 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中文网其他相关文章!