如何等待期货清单完成

时间:2015-06-09 13:07:50

标签: java multithreading

我有一份期货清单,我希望在完成下一步之前完成所有任务。目前我正在这样做:

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只是在每个任务完成后返回?

我们将不胜感激。

1 个答案:

答案 0 :(得分:1)

根据invokeAll()方法的Java规范,List<Future<T>>将包含所有任务的结果,只有当所有线程都完成时才会得到Future,无论是正常还是异常。
因此,您的Future对象应该具有所有结果。

  

执行给定的任务,返回持有他们的期货清单   完成后的状态和结果。

可能性:

  1. 可能发生的事情是你的某些线程由于异常而中止,所以call()方法无法返回所需的结果。此外,由于它是一个新的执行线程,因此您不会看到传播的异常 因此,要计算/管理它,请在call()中包含try-catch方法的所有代码,并从catch中打印堆栈跟踪。你会知道是否有例外。
  2. 另一种可能性是你的一些Callable实现没有返回任何东西,并且可能只是无效,因为你没有在Future对象中得到任何东西。
  3. 验证步骤:
    isDone() - 如果此任务完成,则返回true。完成可能是由于正常终止,例外或取消 - 在所有这些情况下,此方法将返回true。

    for (Future<Integer> future : futureNumbers) {
          System.out.println(future.isDone());  
          numbers[i] = future.get();
    }