模块 java.base

接口 Future<V>

类型参数:
V - 此 Future 的 get 方法返回的结果类型
所有已知的子接口:
RunnableFuture<V> , RunnableScheduledFuture<V> , ScheduledFuture<V>
所有已知的实现类:
CompletableFuture , CountedCompleter , ForkJoinTask , FutureTask , RecursiveAction , RecursiveTask , SwingWorker

public interface Future<V>
Future 表示异步计算的结果。提供了检查计算是否完成、等待其完成以及检索计算结果的方法。结果只能在计算完成时使用方法get 检索,必要时阻塞直到准备就绪。取消由cancel 方法执行。提供了其他方法来确定任务是正常完成还是被取消。一旦计算完成,就不能取消计算。如果您想使用 Future 来实现可取消性但不提供可用结果,您可以声明 Future<?> 形式的类型并返回 null 作为底层任务的结果。

示例用法(请注意,以下类都是虚构的。)

 
 interface ArchiveSearcher { String search(String target); }
 class App {
  ExecutorService executor = ...;
  ArchiveSearcher searcher = ...;
  void showSearch(String target) throws InterruptedException {
   Callable<String> task = () -> searcher.search(target);
   Future<String> future = executor.submit(task);
   displayOtherThings(); // do other things while searching
   try {
    displayText(future.get()); // use future
   } catch (ExecutionException ex) { cleanup(); return; }
  }
 } 
FutureTask 类是实现 RunnableFuture 的实现,因此可以由 Executor 执行。例如,上面带有 submit 的结构可以替换为:
 
 FutureTask<String> future = new FutureTask<>(task);
 executor.execute(future); 

内存一致性影响:异步计算采取的操作 发生在之前 在另一个线程中执行相应的 Future.get() 操作。

自从:
1.5
参见:
  • 内部类总结

    内部类
    修饰符和类型
    接口
    描述
    static enum 
    表示计算状态。
  • 方法总结

    修饰符和类型
    方法
    描述
    boolean
    cancel(boolean mayInterruptIfRunning)
    尝试取消执行此任务。
    default Throwable
    返回任务抛出的异常,无需等待。
    V
    get()
    如有必要,等待计算完成,然后检索其结果。
    V
    get(long timeout, TimeUnit unit)
    如有必要,最多等待计算完成的给定时间,然后检索其结果(如果可用)。
    boolean
    如果此任务在正常完成之前被取消,则返回 true
    boolean
    如果此任务完成,则返回 true
    default V
    返回计算结果,无需等待。
    default Future.State
    返回计算状态。
  • 方法详情

    • cancel

      boolean cancel(boolean mayInterruptIfRunning)
      尝试取消执行此任务。如果任务已经完成或取消,或者由于其他原因无法取消,则此方法无效。否则,如果在调用 cancel 时此任务尚未启动,则此任务永远不会运行。如果任务已经开始,则 mayInterruptIfRunning 参数确定执行此任务的线程(当实现知道时)是否被中断以试图停止任务。

      此方法的返回值不一定表示任务现在是否已取消;使用 isCancelled()

      参数:
      mayInterruptIfRunning - true 执行此任务的线程是否应该被中断(如果线程对实现已知);否则,允许完成正在进行的任务
      返回:
      false 如果任务无法取消,通常是因为它已经完成; true否则。如果两个或更多线程导致任务被取消,则至少其中一个返回 true 。实施可以提供更强的保证。
    • isCancelled

      boolean isCancelled()
      如果此任务在正常完成之前被取消,则返回 true
      返回:
      true 如果此任务在完成之前被取消
    • isDone

      boolean isDone()
      如果此任务完成,则返回 true。完成可能是由于正常终止、异常或取消——在所有这些情况下,此方法将返回 true
      返回:
      true如果这个任务完成
    • get

      如有必要,等待计算完成,然后检索其结果。
      返回:
      计算结果
      抛出:
      CancellationException - 如果计算被取消
      ExecutionException - 如果计算抛出异常
      InterruptedException - 如果当前线程在等待时被中断
    • get

      V  get(long timeout, TimeUnit  unit) throws InterruptedException , ExecutionException , TimeoutException
      如有必要,最多等待计算完成的给定时间,然后检索其结果(如果可用)。
      参数:
      timeout - 最长时间等待
      unit - 超时参数的时间单位
      返回:
      计算结果
      抛出:
      CancellationException - 如果计算被取消
      ExecutionException - 如果计算抛出异常
      InterruptedException - 如果当前线程在等待时被中断
      TimeoutException - 如果等待超时
    • resultNow

      default V  resultNow()
      返回计算结果,无需等待。

      此方法适用于调用者知道任务已成功完成的情况,例如,为成功的任务过滤 Future 对象流并使用map操作获取结果流时。

        results = futures.stream()
              .filter(f -> f.state() == Future.State.SUCCESS)
              .map(Future::resultNow)
              .toList();
       
      实现要求:
      默认实现调用 isDone() 来测试任务是否已完成。如果完成,它会调用 get() 来获取结果。
      返回:
      计算结果
      抛出:
      IllegalStateException - 如果任务尚未完成或任务未完成并有结果
      自从:
      19
    • exceptionNow

      default Throwable  exceptionNow()
      返回任务抛出的异常,无需等待。

      此方法适用于调用者知道任务已完成但出现异常的情况。

      实现要求:
      默认实现调用 isDone() 来测试任务是否已完成。如果完成且未取消,它会调用 get() 并捕获 ExecutionException 以获取异常。
      返回:
      任务抛出的异常
      抛出:
      IllegalStateException - 如果任务还没有完成,任务正常完成,或者任务被取消
      自从:
      19
    • state

      default Future.State  state()
      返回计算状态。
      实现要求:
      默认实现使用 isDone()isCancelled()get() 来确定状态。
      返回:
      计算状态
      自从:
      19