我有一份期货清单,我希望在完成下一步之前完成所有任务。目前我正在这样做:
public static int[] benchmark(){
List<Future<Integer>> futureNumbers = service.invokeAll(callableList);
int[] numbers = new int[events.size()];
int i = 0;
for (Future<Integer> future : futureNumbers) {
numbers[i] = future.get();
}
return numbers;
}
但是只有我得到的数组的第一个值是正确的,其他的是0.我怎样才能实现numbers
只是在每个任务完成后返回?
我们将不胜感激。
答案 0 :(得分:1)
根据invokeAll()
方法的Java规范,List<Future<T>>
将包含所有任务的结果,只有当所有线程都完成时才会得到Future
,无论是正常还是异常。
因此,您的Future对象应该具有所有结果。
执行给定的任务,返回持有他们的期货清单 完成后的状态和结果。
可能性:
call()
中包含try-catch
方法的所有代码,并从catch中打印堆栈跟踪。你会知道是否有例外。Future
对象中得到任何东西。 验证步骤:
isDone()
- 如果此任务完成,则返回true。完成可能是由于正常终止,例外或取消 - 在所有这些情况下,此方法将返回true。
for (Future<Integer> future : futureNumbers) {
System.out.println(future.isDone());
numbers[i] = future.get();
}