# Java FutureTask详解## 简介`java.util.concurrent.FutureTask` 是一个实现了 `RunnableFuture` 接口的类,`RunnableFuture` 接口同时继承了 `Runnable` 和 `Future` 接口。这意味着 `FutureTask` 既可以作为一个独立的线程任务运行,又可以用来获取异步计算的结果。它提供了一种灵活的方式来处理异步操作的结果,并对结果的获取进行控制。 简而言之,`FutureTask` 将一个 Callable 或 Runnable 封装起来,并提供了获取结果、取消任务以及检查任务状态等功能。## 一、 `FutureTask` 的核心功能`FutureTask` 的主要功能包括:
执行 Callable 或 Runnable:
`FutureTask` 可以包装一个 `Callable` 对象(Callable 接口返回计算结果)或一个 `Runnable` 对象(Runnable 接口不返回结果)。 通过调用 `run()` 方法可以启动任务执行。
获取结果 (get()):
调用 `get()` 方法可以获取异步计算的结果。 如果任务尚未完成,`get()` 方法会阻塞当前线程,直到任务完成并返回结果。`get()` 方法会抛出 `ExecutionException` 或 `InterruptedException` 异常。
`ExecutionException`: 如果 Callable 中的 `call()` 方法抛出异常,则 `get()` 方法会抛出 `ExecutionException`,其 `getCause()` 方法可以获取原始异常。
`InterruptedException`: 如果在等待结果的过程中,当前线程被中断,则会抛出 `InterruptedException`。
取消任务 (cancel()):
调用 `cancel(boolean mayInterruptIfRunning)` 方法可以取消任务。参数 `mayInterruptIfRunning` 指定是否中断正在运行的任务。如果任务已经完成或无法取消,则返回 `false`。
检查任务状态 (isDone(), isCancelled()):
`isDone()` 方法返回 `true` 表示任务已经完成(成功或异常终止),`isCancelled()` 方法返回 `true` 表示任务已经被取消。## 二、 `FutureTask` 的使用示例### 2.1 使用 Callable```java
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;public class FutureTaskExample {public static void main(String[] args) throws ExecutionException, InterruptedException {ExecutorService executor = Executors.newSingleThreadExecutor();// 创建一个 Callable 对象Callable
Java FutureTask详解
简介`java.util.concurrent.FutureTask` 是一个实现了 `RunnableFuture` 接口的类,`RunnableFuture` 接口同时继承了 `Runnable` 和 `Future` 接口。这意味着 `FutureTask` 既可以作为一个独立的线程任务运行,又可以用来获取异步计算的结果。它提供了一种灵活的方式来处理异步操作的结果,并对结果的获取进行控制。 简而言之,`FutureTask` 将一个 Callable 或 Runnable 封装起来,并提供了获取结果、取消任务以及检查任务状态等功能。
一、 `FutureTask` 的核心功能`FutureTask` 的主要功能包括:* **执行 Callable 或 Runnable:** `FutureTask` 可以包装一个 `Callable` 对象(Callable 接口返回计算结果)或一个 `Runnable` 对象(Runnable 接口不返回结果)。 通过调用 `run()` 方法可以启动任务执行。* **获取结果 (get()):** 调用 `get()` 方法可以获取异步计算的结果。 如果任务尚未完成,`get()` 方法会阻塞当前线程,直到任务完成并返回结果。`get()` 方法会抛出 `ExecutionException` 或 `InterruptedException` 异常。* `ExecutionException`: 如果 Callable 中的 `call()` 方法抛出异常,则 `get()` 方法会抛出 `ExecutionException`,其 `getCause()` 方法可以获取原始异常。* `InterruptedException`: 如果在等待结果的过程中,当前线程被中断,则会抛出 `InterruptedException`。* **取消任务 (cancel()):** 调用 `cancel(boolean mayInterruptIfRunning)` 方法可以取消任务。参数 `mayInterruptIfRunning` 指定是否中断正在运行的任务。如果任务已经完成或无法取消,则返回 `false`。* **检查任务状态 (isDone(), isCancelled()):** `isDone()` 方法返回 `true` 表示任务已经完成(成功或异常终止),`isCancelled()` 方法返回 `true` 表示任务已经被取消。
二、 `FutureTask` 的使用示例
2.1 使用 Callable```java
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;public class FutureTaskExample {public static void main(String[] args) throws ExecutionException, InterruptedException {ExecutorService executor = Executors.newSingleThreadExecutor();// 创建一个 Callable 对象Callable
2.2 使用 Runnable```java
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;public class FutureTaskRunnableExample {public static void main(String[] args) throws InterruptedException {ExecutorService executor = Executors.newSingleThreadExecutor();Runnable runnable = () -> {System.out.println("Runnable task is running...");try {Thread.sleep(2000);} catch (InterruptedException e) {Thread.currentThread().interrupt();}};FutureTask
三、 `FutureTask` 与其他并发工具的比较`FutureTask` 提供了比直接使用 `ExecutorService.submit()` 更精细的控制,特别是对于需要在任务完成后获取结果或者取消任务的情况。 与 `CompletableFuture` 相比,`FutureTask` 功能相对简单,但更易于理解和使用,尤其适合那些对并发编程不太熟悉的开发者。 `CompletableFuture` 提供了更丰富的功能,例如组合异步操作、异常处理等等,适用于更复杂的场景。
四、 总结`FutureTask` 是一个功能强大的工具,可以有效地管理异步任务并获取其结果。 理解并熟练运用 `FutureTask` 能提高程序的并发性能和可读性。 选择使用 `FutureTask` 还是 `CompletableFuture` 取决于具体的应用场景和复杂度。 对于简单的异步操作,`FutureTask` 足够胜任;对于更复杂的场景,`CompletableFuture` 提供了更强大的功能。