简述什么是 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
对象,你可以使用这个对象来查询任务的状态和获取结果。这种方式更为简洁和直观。