目录
FutureTask是Java中的一个类,用于表示可获取结果的异步任务。它实现了java.util.concurrent.Future接口,提供了启动和取消异步任务、查询任务是否已完成以及获取最终结果的方法。通过调用get()方法可以获取异步任务的结果,但会阻塞当前线程直至任务执行结束。一旦任务执行结束,任务不能重新启动或取消,除非调用runAndReset()方法。在FutureTask的源码中定义了多种状态,包括
- private static final int NEW = 0;
- private static final int COMPLETING = 1;
- private static final int NORMAL = 2;
- private static final int EXCEPTIONAL = 3;
- private static final int CANCELLED = 4;
- private static final int INTERRUPTING = 5;
- private static final int INTERRUPTED = 6;
根据FutureTask.run()方法的执行的时机,FutureTask分为了3种状态:
1、未启动状态:指的是在创建FutureTask后,但尚未执行FutureTask.run()方法之前,FutureTask处于未启动状态。
2、已启动状态:指的是FutureTask.run()方法正在被执行的过程中,此时FutureTask处于已启动状态。
3、已完成状态:包括了三种情况:
以上三种情况都属于FutureTask的已完成状态。
对于FutureTask的get()方法和cancel()方法,它们在不同状态下的行为总结如下:
1、get方法:
2、cancel方法:

FutureTask除了实现了Future接口,还实现了Runnable接口,这使得它既可以作为一个异步任务,也可以作为一个可执行的任务被线程执行。因此,它可以交给Executor执行,也可以由调用的线程直接执行(FutureTask.run())。另外,通过ExecutorService的submit()方法也可以返回一个FutureTask对象,然后可以通过FutureTask.get()或者FutureTask.cancel方法获取结果或取消任务的执行。
以下是一个简单的示例,演示了如何使用FutureTask来实现多线程任务的协调和管理,
- import java.util.concurrent.*;
-
- public class main {
-
- public static void main(String[] args) {
- // 创建一个FutureTask对象
- FutureTask
futureTask = new FutureTask<>(() -> { - // 模拟一个耗时的任务,这里使用Thread.sleep来模拟
- Thread.sleep(2000);
- return 42; // 返回结果
- });
-
- // 创建一个线程池
- ExecutorService executor = Executors.newFixedThreadPool(1);
-
- // 使用线程池执行FutureTask
- executor.execute(futureTask);
-
- // 在主线程中可以做一些其他的事情
-
- try {
- // 获取FutureTask的结果,如果任务还未完成,则会阻塞当前线程直到任务完成
- int result = futureTask.get();
- System.out.println("任务执行结果:" + result);
- } catch (InterruptedException | ExecutionException e) {
- e.printStackTrace();
- }
-
- // 关闭线程池
- executor.shutdown();
- }
- }
在这个示例中,我们创建了一个FutureTask对象来执行一个耗时的任务,然后将它交给线程池来执行。在主线程中,我们可以做一些其他的事情,然后通过futureTask.get()方法来获取任务的执行结果。如果任务还未完成,get()方法会阻塞当前线程直到任务完成。
这个示例展示了如何使用FutureTask来实现异步任务的执行和结果获取,同时也展示了使用ExecutorService来执行线程任务,并在任务完成后关闭线程池。
在实际应用中,FutureTask通常用于以下场景:
总的来说,FutureTask提供了一种方便的方式来管理异步任务的执行和获取结果,同时也可以用于多线程任务的协调与控制。当需要在多线程环境下进行任务调度和管理时,FutureTask是一个非常有用的工具。