Java 8 中的 Future

17 Mar 2025 | 4 分钟阅读

在 Java 中,Callable 接口是在 Java 5 中引入的,作为现有 Runnable 接口的替代。它封装了一个任务,并将其传递给一个线程或线程池进行异步执行。Callable 代表一个异步计算,其值可以通过 Future 对象获得。所有需要异步执行的代码都放在 call() 方法中。Callable 也是一个单一抽象方法类型,因此可以与 Java 8 的 lambda 表达式 一起使用。Callable 和 Future 都是参数化类型,可以用来包装 Integer、String 或任何其他类。

在本节中,我们将理解 Java 8 中的 Future 是什么,它的功能, 方法以及 Future 的实现

Java 8 Future 接口

Java 8 中,Future 是一个属于 java.util.concurrent 接口。它用于表示异步计算的结果。请注意,它与 JavaScript 的 Promise 非常相似。

语法

其中 V 是 future 返回结果的类型。

Future 接口示例

Java Future 最常见的例子是 ExecutorService 接口。它会生成一个 Future(来自其某些方法)对象,用于跟踪一个或多个异步任务的进度。

Future 接口的方法

该接口提供了检查计算是否已完成、等待其完成以及检索计算结果的方法。结果只能在计算完成后才能获得,否则会阻塞计算直到结果就绪。一旦任务或计算完成,就无法取消该计算。

该接口提供了以下方法。

方法描述
cancel()它尝试取消任务的执行。
get()该方法在必要时等待计算完成,然后检索其结果。
get()在必要时,等待最多给定的时间以完成计算,然后检索其结果(如果可用)。
isCancelled()如果任务在完成前被取消,则返回 true。
isDone()如果任务已完成,则返回 true。

Future 接口的缺点

Future 接口存在一些局限性,如下所示:

  • 使用 Future,无法手动完成计算。
  • 计算完成后,它不会发出通知。
  • 缺乏诸如创建可链接的处理阶段以及并行运行 Future 并合并其结果之类的机制。
  • 它不提供任何异常处理构造。

为了克服上述限制,Java 8 引入了具体的 Future 实现,它们提供了以下功能:

实施

在 Java 程序中实现 Future 接口之前,我们首先看一下 Future 接口所属的基本接口和类。

Callable 接口是 Runnable 接口的进阶版本。它表示一个返回结果并可能抛出异常的任务。如果想使用 Callable 接口,请实现不带任何参数的 call() 方法。

为了将 Callable 传递给线程池,请使用 ExecutorService。创建 ExecutorService 的最简单方法是使用 Executors 类的工厂方法之一。对于并发执行,它会选择一个线程并执行 Callable。它会立即返回一个 Future 对象,该对象确保在计算完成后保存计算结果。之后,调用 Future 接口的 get() 方法来获取计算结果。

Java Future 示例

以下 Java 程序演示了如何将 Callable 和 Future 结合使用以在 Java 中实现异步处理。

FutureExample.java

输出

I am in temp method
In call method of PrintString class MySQL
In call method of PrintString class Python
In call method of PrintString class Flutter
In call method of PrintString class Java
In call method of PrintString class Bash
In call method of PrintString class Go
1. Length of string Java is 4
2. Length of string Python is 6
3. Length of string Flutter is 7
4. Length of string MySQL is 5
5. Length of string Bash is 4
6. Length of string Go is 2