gpt4 book ai didi

java - Future.get() 不返回所有结果

转载 作者:行者123 更新时间:2023-12-01 16:33:37 31 4
gpt4 key购买 nike

我正在创建 15 个可调用任务,并提交它们:

List<Future<MyResult>> futures = new ArrayList<Future<MyResult>>();
List<MyResult> myResults = new ArrayList<MyResult>();

for(int i = 1; i <= 15; i++){
Callable<MyResult> task = new MyProcessor(//parameters);
Future<MyResult> future = executorService.submit(task);
futures.add(future);//used to iterate over to call get() to collect results in next for loop
}

然后我收集 15 个 MyResult 对象:

for(Future<MyResult> future : futures){
try {
MyResult myResult = future.get();
processorResults.add(myResult);
} catch (InterruptedException e) {
//...
} catch (ExecutionException e) {
//...
}
}

问题是:我有时获取的对象少于 15 个,而不是从 get() 方法获取所有 15 个 MyResult 对象。有时 12 个,有时 10 个,有时甚至更少,有时全部 15 个。

我的印象是 get() 方法是一个阻塞调用,将等待所有 15 个线程返回各自的结果,但看起来我错过了其中一些并继续前进。我做错了什么?我是否没有正确收集结果/等待结果?当任何 MyProcessor 任务抛出错误时是否会发生这种情况?

最佳答案

这可能意味着您的某些作业抛出了异常。从您的代码中很难看出,但您需要对 ExecutionException 执行一些操作,而不是捕获并忽略它。

当您提交的 Callable 中抛出 RuntimeException 时,

Future.get() 会抛出 ExecutionException >call() 方法。仅当该方法通过 return 正常返回时,它才会返回您的 MyResult。您可以通过执行以下操作来获取引发的异常:

} catch (ExecutionException e) {
// account for the throw here, the original exception is in e.getCause()
// log it, count it, or ...
logger.error("Job threw exception: " + e.getCause());
}

I was under the impression that get() method is a blocking call and will wait for ALL 15 threads to get back with respective results,

这是正确的。当您调用 future.get() 时,它将阻塞,直到作业完成 - 通过抛出异常或返回。如果正在执行 get() 的线程被中断,则 get() 会抛出 InterruptedException,该异常也应该被捕获而不仅仅是被忽略.

关于java - Future.get() 不返回所有结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11726679/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com