Java 中的 Callable 和 Future

17 Mar 2025 | 5 分钟阅读

在 Java 中,Callable 和 Future 是与线程相关的两个最重要的概念。在本节中,我们将了解如何在我们的代码中使用 Callable 和 Future。

Future 用于存储从不同线程接收到的结果,而 Callable 与 Runnable 类似,它封装了一个将在另一个线程上运行的任务。

Callable and Future in Java

让我们通过示例逐一理解它们。

Callable 接口

Java 提供了两种创建线程的方式,即通过扩展 Thread 类和创建带有 Runnable 的线程。使用 Runnable 接口创建线程有一个缺点,即我们无法让线程在终止时返回结果,即当 run() 完成时。为了克服这个缺点,Java 提供了 Callable 接口。

Callable 和 Runnable 方法之间的两个主要区别如下:

  1. run() 方法用于实现 Runnable,而 call() 方法用于实现 Callable。run() 方法不返回任何内容,而 call() 方法返回完成的结果。
  2. call() 方法可以抛出异常,而 run() 方法不能。

注意:我们可以通过使用 Runnable 来创建线程,而不是通过使用 Callable。

call() 方法的语法如下:

public Object call() throws Exception;

让我们举一个例子来理解如何使用 Callable 接口:

CallableInterfaceExample.java

Future

在 main() 方法中,call() 方法的返回值(完成后的)应该存储在一个对象中,以便了解线程返回的结果。为了在 main() 方法中存储返回的数据,我们使用 Future 对象。

Future 是我们可以跟踪来自其他线程的进度和结果的一种方式。我们需要重写五个方法来实现 Future 接口。cancel()get()isDone() 方法是 Future 接口中最重要的三个方法。

public boolean cancel(boolean mayInterrupt)

cancel() 方法用于在任务尚未开始时停止任务。如果任务已开始,并且 mayInterrupt 布尔值为 true,它还将中断该任务。

public Object get() throws InterruptedException

该方法返回任务的结果。如果任务已完成,则立即返回结果;否则,它将等待其完成然后返回结果。

public boolean isDone() throws InterruptedException

它根据任务的完成情况返回一个布尔值。

注意:要创建线程,必须有一个 Runnable。

注意:要获得结果,必须有一个 Future。

让我们举一个例子来理解如何使用 Future 在 main() 方法中存储 call() 的返回结果:

CallableFutureExample.java

输出

Callable and Future in Java

让我们看另一个例子,在这个例子中我们将只使用 Runnable 接口。

RunnableExample.java

输出

Callable and Future in Java