FutureTask是实现Runnable和Future接口的可取消异步任务包装器,支持提交执行、状态查询、结果获取与取消;通过Callable或Runnable+返回值构造,调用get()获取结果(可超时),isDone()/isCancelled()检查状态,推荐交由ExecutorService管理。

在 Java 多线程中,FutureTask 是一个可取消的异步计算任务包装器,它实现了 Runnable 和 Future 接口,既能提交给线程池执行,又能主动查询状态、获取结果或取消任务。
如何创建并启动 FutureTask
FutureTask 构造函数接收 Callable(推荐,支持返回值和异常)或 Runnable + 返回值(用 FutureTask(Runnable, V) 形式)。常用方式是传入 Callable:
- 定义一个实现
Callable的任务,比如模拟耗时计算 - 用该
Callable创建FutureTask - 将
FutureTask当作Runnable提交给Thread或线程池(如ExecutorService)
示例:
Callable<integer> task = () -> {<br> Thread.sleep(2000);<br> return 42;<br>};<br>FutureTask<integer> futureTask = new FutureTask(task);<br>new Thread(futureTask).start(); // 或 executor.submit(futureTask);</integer></integer>如何获取异步计算结果
调用 get() 方法阻塞等待结果返回。它有两种常用重载形式:
-
get():无限期等待,直到任务完成(可能抛出InterruptedException或ExecutionException) -
get(long timeout, TimeUnit unit):带超时等待,超时未完成则抛出TimeoutException
注意:get() 只能调用一次;若任务已执行完毕,会立即返回结果;若任务被取消,会抛出 CancellationException。
如何检查任务执行状态
FutureTask 提供了多个状态判断方法,适合在不阻塞的前提下了解任务进展:
-
isDone():任务是否已完成(包括正常结束、异常终止或被取消) -
isCancelled():任务是否已被取消(且尚未开始,或正在运行中被成功中断) -
cancel(boolean mayInterruptIfRunning):尝试取消任务;参数为true表示允许中断正在运行的线程
例如:可在轮询或回调逻辑中先调用 isDone(),再决定是否调用 get() 避免不必要的阻塞。
如何结合线程池高效使用 FutureTask
虽然 FutureTask 本身可直接用 Thread 启动,但更推荐交给 ExecutorService 管理:
- 提交后仍可保留对
FutureTask的引用,用于后续状态检查与结果获取 - 避免手动管理线程生命周期,复用资源,提升吞吐量
- 注意:若用
executor.submit(task)(其中 task 是FutureTask),返回的是同一个FutureTask实例,不是新包装对象
小提示:如果只是简单异步执行并获取结果,也可直接用 executor.submit(Callable),它内部自动创建 FutureTask,无需显式构造。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











