如何等待一组 Future 完成

3

我有一个Future列表,我希望在执行下一步之前完成每个任务。目前我是这样做的:

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?

感谢您的帮助。


只是一个列表,不重要。 - user4878548
2
为什么不重要?如果它的大小与“futureNumbers”不同,那么它就非常相关。 - RealSkeptic
大小正确,但除了第一个值以外,所有值都为0。因此,其他索引是“空的”,未填充来自未来的值。 - user4878548
10
我看不到 i++,你总是写入[0]位置... - TheCodingFrog
哎呀...今天真是累啊。谢谢,那个真的没必要。 - user4878548
1个回答

0
根据Java规范,invokeAll()方法中的List<Future<T>>将包含所有任务的结果,只有当所有线程正常完成或由于异常而结束时,您才会得到Future对象。
因此,您的Future对象应该包含所有结果。

执行给定的任务,返回一个Future列表,其中包含它们的状态和结果。

可能原因:

  1. 可能发生的情况是某些线程因异常而中止,因此call()方法无法返回所需的结果。另外,由于这是一条新的执行线程,您将看不到异常传播。
    为了应对/管理这种情况,将call()方法的所有代码都放在try-catch中,并从catch中打印堆栈跟踪。您将知道是否存在某些异常。
  2. 另一个可能性是,一些Callable实现没有返回任何内容,并且可能只是void,因此您在Future对象中什么也没有得到。

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接