簡體   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