例如,我正在创建 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 任务抛出 ERROR 时会发生这种情况吗?