Module java.base

Interface 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(); // 在搜索时执行其他操作
     try {
       displayText(future.get()); // 使用future
     } catch (ExecutionException ex) { cleanup(); return; }
   }
 }
FutureTask类是Future的实现,实现了Runnable,因此可以由Executor执行。例如,可以用execute替换上述使用submit的构造方式:
 
 FutureTask<String> future = new FutureTask<>(task);
 executor.execute(future);

内存一致性效果: 异步计算采取的操作在另一个线程中对应的Future.get()之后发生。

自 JDK 版本:
1.5
参见:
  • Nested Class Summary

    Nested Classes
    Modifier and Type
    Interface
    Description
    static enum 
    表示计算状态。
  • Method Summary

    Modifier and Type
    Method
    Description
    boolean
    cancel(boolean mayInterruptIfRunning)
    尝试取消执行此任务。
    default Throwable
    返回任务抛出的异常,无需等待。
    V
    get()
    等待计算完成,然后检索其结果。
    V
    get(long timeout, TimeUnit unit)
    必要时等待最多指定时间以完成计算,然后检索其结果(如果可用)。
    boolean
    如果此任务在正常完成之前被取消,则返回true
    boolean
    isDone()
    如果此任务已完成,则返回true
    default V
    返回计算的结果,无需等待。
    default Future.State
    state()
    返回计算状态。
  • Method Details

    • 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对象以获取成功任务并使用映射操作获取结果流的情况。

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

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

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

      实现要求:
      默认实现调用isDone()来测试任务是否已完成。如果已完成且未取消,则调用get()并捕获ExecutionException来获取异常。
      返回:
      任务抛出的异常
      抛出:
      IllegalStateException - 如果任务尚未完成,任务已正常完成,或任务已取消
      自 JDK 版本:
      19
    • state

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