首页 >Java >java教程 >如何高效等待期货列表并处理异常?

如何高效等待期货列表并处理异常?

Linda Hamilton
Linda Hamilton原创
2024-10-26 00:48:28991浏览

How to Efficiently Wait for a List of Futures and Handle Exceptions?

高效等待期货列表

处理期货列表时,目标是等到完成或发生任何未来都是例外。如果早期发生异常,涉及单独调用 f.get() 的简单方法可能会导致不必要的等待。

使用 CompletionService 避免不必要的等待

解决此问题问题,CompletionService 类开始发挥作用。它允许执行异步任务,并在其结果可用时以线程安全的方式检索它们的结果。使用方法如下:

<code class="java">Executor executor = Executors.newFixedThreadPool(4);
CompletionService<SomeResult> completionService = new ExecutorCompletionService<>(executor);

// Submit tasks to the service
for (int i = 0; i < 4; i++) {
    completionService.submit(new Callable<SomeResult>() {
        @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 < 4 && !errors) {
    Future<SomeResult> 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</code>

通过使用 CompletionService 方法,您可以实时监控任务的完成情况,并在发生错误时停止进一步处理,从而避免不必要的等待。

以上是如何高效等待期货列表并处理异常?的详细内容。更多信息请关注PHP中文网其他相关文章!

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