首页  >  文章  >  Java  >  如何使用CompletionService来优化等待future列表并高效处理异常?

如何使用CompletionService来优化等待future列表并高效处理异常?

Patricia Arquette
Patricia Arquette原创
2024-10-25 19:58:29928浏览

How can CompletionService be used to optimize waiting for a list of futures and handle exceptions efficiently?

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn