从计算中检索值 - 可调用

如果你的计算产生一些后来需要的返回值,则一个简单的 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)中断的任务,如果它当前正在运行。