跳到主要内容

简述什么是 FutureTask?使用 ExecutorService 启动任务 ?

参考答案:

FutureTask 是 Java 中的一个类,它实现了 FutureRunnable 接口。FutureTask 可以用作异步计算的结果。它表示一个异步计算的结果。它可以在计算完成之前被取消,还可以查询计算是否已经完成,以及等待计算的完成并获取结果。

FutureTask 通常与 ExecutorService 一起使用,ExecutorService 是 Java 中的一个接口,它提供了一种管理和控制线程池的方式。使用 ExecutorService,你可以将任务提交给线程池进行异步执行,而不需要自己创建和管理线程。

下面是一个简单的示例,演示了如何使用 FutureTaskExecutorService 启动任务:

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

注意,在实际应用中,通常会使用 ExecutorServicesubmit 方法直接提交一个 Callable 任务,而不是先创建 FutureTasksubmit 方法会返回一个 Future 对象,你可以使用这个对象来查询任务的状态和获取结果。这种方式更为简洁和直观。