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