從計算中檢索值 - 可呼叫

如果你的計算產生一些後來需要的返回值,則一個簡單的 Runnable 任務是不夠的。對於這種情況,你可以使用 ExecutorService.submit( Callable <T>),它在執行完成後返回一個值。

服務將返回 Future ,你可以使用它來檢索任務執行的結果。

// Submit a callable for execution
ExecutorService pool = anExecutorService;
Future<Integer> future = pool.submit(new Callable<Integer>() {
    @Override public Integer call() {
        //do some computation
        return new Random().nextInt();
    }
});    
// ... perform other tasks while future is executed in a different thread

當你需要獲得未來的結果時,請致電 future.get()

  • 無限期等待將來結果。

      try {
          // Blocks current thread until future is completed
          Integer result = future.get(); 
      catch (InterruptedException || ExecutionException e) {
          // handle appropriately
      }
    
  • 等待將來完成,但不要超過指定的時間。

      try {
          // Blocks current thread for a maximum of 500 milliseconds.
          // If the future finishes before that, result is returned,
          // otherwise TimeoutException is thrown.
          Integer result = future.get(500, TimeUnit.MILLISECONDS); 
      catch (InterruptedException || ExecutionException || TimeoutException e) {
          // handle appropriately
      }
    

如果不再需要計劃或執行任務的結果,你可以呼叫 Future.cancel(boolean) 取消它。

  • 呼叫 cancel(false) 只會從要執行的任務佇列中刪除任務。
  • 呼叫 cancel(true)中斷的任務,如果它當前正在執行。