简述什么是 FutureTask?使用 ExecutorService 启动任务 ?
参考答案:
FutureTask 是 Java 中的一个类,它实现了 Future 和 Runnable 接口。FutureTask 可以用作异步计算的结果。它表示一个异步计算的结果。它可以在计算完成之前被取消,还可以查询计算是否已经完成,以及等待计算的完成并获取结果。
FutureTask 通常与 ExecutorService 一起使用,ExecutorService 是 Java 中的一个接口,它提供了一种管理和控制线程池的方式。使用 ExecutorService,你可以将任务提交给线程池进行异步执行,而不需要自己创建和管理线程。
下面是一个简单的示例,演示了如何使用 FutureTask 和 ExecutorService 启动任务:
import java.util.concurrent.*;
public class FutureTaskExample {
public static void main(String[] args) throws ExecutionException, InterruptedException {
// 创建一个 ExecutorService
ExecutorService executor = Executors.newSingleThreadExecutor();
// 创建一个 FutureTask 实例
FutureTask<String> futureTask = new FutureTask<>(() -> {
// 模拟耗时任务
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "计算结果";
});
// 提交任务给 ExecutorService
executor.submit(futureTask);
// 可以在任务完成之前做其他事情
System.out.println("任务正在执行...");
// 获取任务的结果
String result = futureTask.get(); // 这会阻塞,直到任务完成
System.out.println("任务结果:" + result);
// 关闭 ExecutorService
executor.shutdown();
}
}
在这个示例中,我们首先创建了一个 ExecutorService 实例。然后,我们创建了一个 FutureTask 实例,该实例包含了一个耗时任务。我们将这个 FutureTask 实例提交给 ExecutorService 进行异步执行。在任务执行期间,我们可以执行其他代码。最后,我们使用 futureTask.get() 方法获取任务的结果。这个方法会阻塞,直到任务完成。最后,我们关闭了 ExecutorService。
注意,在实际应用中,通常会使用 ExecutorService 的 submit 方法直接提交一个 Callable 任务,而不是先创建 FutureTask。submit 方法会返回一个 Future 对象,你可以使用这个对象来查询任务的状态和获取结果。这种方式更为简洁和直观。