繁体   English   中英

如何等待期货清单完成

[英]How to wait for a list of Futures to complete

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

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

非常感谢您的帮助。

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

执行给定的任务,返回完成所有状态和结果的Futures列表。

可能性:

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

验证步骤:
isDone() - 如果此任务完成,则返回true。 完成可能是由于正常终止,异常或取消 - 在所有这些情况下,此方法将返回true。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM