javafuturetask(javafuturetask详解)

# 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 callable = () -> {System.out.println("Callable task is running...");Thread.sleep(2000); // 模拟耗时操作return 100;};// 创建 FutureTask 对象FutureTask futureTask = new FutureTask<>(callable);// 提交任务到线程池executor.submit(futureTask);// 执行其他任务...System.out.println("Waiting for the result...");// 获取结果Integer result = futureTask.get();System.out.println("Result: " + result);executor.shutdown();} } ```### 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 = new FutureTask<>(runnable, null); // null for Runnableexecutor.submit(futureTask);futureTask.get(); //Wait for completion. Note: No result to get from a Runnableexecutor.shutdown();} } ```## 三、 `FutureTask` 与其他并发工具的比较`FutureTask` 提供了比直接使用 `ExecutorService.submit()` 更精细的控制,特别是对于需要在任务完成后获取结果或者取消任务的情况。 与 `CompletableFuture` 相比,`FutureTask` 功能相对简单,但更易于理解和使用,尤其适合那些对并发编程不太熟悉的开发者。 `CompletableFuture` 提供了更丰富的功能,例如组合异步操作、异常处理等等,适用于更复杂的场景。## 四、 总结`FutureTask` 是一个功能强大的工具,可以有效地管理异步任务并获取其结果。 理解并熟练运用 `FutureTask` 能提高程序的并发性能和可读性。 选择使用 `FutureTask` 还是 `CompletableFuture` 取决于具体的应用场景和复杂度。 对于简单的异步操作,`FutureTask` 足够胜任;对于更复杂的场景,`CompletableFuture` 提供了更强大的功能。

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 callable = () -> {System.out.println("Callable task is running...");Thread.sleep(2000); // 模拟耗时操作return 100;};// 创建 FutureTask 对象FutureTask futureTask = new FutureTask<>(callable);// 提交任务到线程池executor.submit(futureTask);// 执行其他任务...System.out.println("Waiting for the result...");// 获取结果Integer result = futureTask.get();System.out.println("Result: " + result);executor.shutdown();} } ```

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 = new FutureTask<>(runnable, null); // null for Runnableexecutor.submit(futureTask);futureTask.get(); //Wait for completion. Note: No result to get from a Runnableexecutor.shutdown();} } ```

三、 `FutureTask` 与其他并发工具的比较`FutureTask` 提供了比直接使用 `ExecutorService.submit()` 更精细的控制,特别是对于需要在任务完成后获取结果或者取消任务的情况。 与 `CompletableFuture` 相比,`FutureTask` 功能相对简单,但更易于理解和使用,尤其适合那些对并发编程不太熟悉的开发者。 `CompletableFuture` 提供了更丰富的功能,例如组合异步操作、异常处理等等,适用于更复杂的场景。

四、 总结`FutureTask` 是一个功能强大的工具,可以有效地管理异步任务并获取其结果。 理解并熟练运用 `FutureTask` 能提高程序的并发性能和可读性。 选择使用 `FutureTask` 还是 `CompletableFuture` 取决于具体的应用场景和复杂度。 对于简单的异步操作,`FutureTask` 足够胜任;对于更复杂的场景,`CompletableFuture` 提供了更强大的功能。

Powered By Z-BlogPHP 1.7.2

备案号:蜀ICP备2023005218号