2012-10-14 68 views
2

參照下面的代碼。Future.get阻塞?

for (Future<Long> future : list) { 
      try { 
       sum += future.get(); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } catch (ExecutionException e) { 
       e.printStackTrace(); 
      } 
     } 

現在,當我呼叫future.get會阻止呼叫?所以如果我在主線程和android應用程序上執行此操作,會導致ANR異常?我注意到中斷異常也被拋出,所以這意味着它們是在get函數中調用線程的睡眠?

回答

4
  1. 是的,Future.get()文檔說:

    如有必要,等待計算完成,然後獲取其結果。

    因此,它會阻塞,直到計算結果可用,或計算被中斷(取消或導致異常)。

  2. 可能如果您的計算需要很長時間才能完成,則會導致ANR。

  3. 再次,從Future.get()文檔:

    @throws InterruptedException的,如果當前的線程在等待

    現在,因爲你從主線程中調用Future.get()中斷,我懷疑這是Android系統會中斷您的主線程,嘗試使其再次響應。但是它也可能是由應用程序的另一個線程引起的 - 很難說,因爲你沒有指定你的應用程序的功能,它創建了什麼線程,何時使用ExecutorService(如果是,哪個實現),等等。

  4. 不,FutureTask.get()(我相信你正在使用的Future的執行)不叫Thread.sleep()。相反,將線程置於等待模式是通過線程停車完成的,這導致它不被安排執行,直到發出信號。如果在主線程中完成,這可能會導致ANR錯誤。對於parking機制的細節考慮閱讀文檔和this question

0

你可以簡單地檢查,如果未來「做」調用的Future.isDone()。代碼示例:

String result = ""; 

if (myFuture.isDone()) result = (String) myFuture.get(); 

您可能想要在無限循環中檢查它。