FutureTask 是 Java 中用于获取异步执行结果的任务容器,它同时实现 Runnable 和 Future 接口,需传入 Callable 构造,通过 get() 获取结果(可阻塞或超时),支持状态查询与取消。

Java 中通过 FutureTask 获取异步执行结果,核心是把它当作一个可提交给线程池的“任务容器”,它既实现了 Runnable 又实现了 Future,因此既能被线程执行,又能主动查询、等待或取消结果。
创建 FutureTask 并传入 Callable
FutureTask 的构造函数接收一个 Callable(有返回值、可抛异常),这是获取结果的前提。不能用 Runnable,因为它没有返回值。
示例:
Callable<String> task = () -> {
Thread.sleep(1000);
return "Hello from FutureTask";
};
FutureTask<String> futureTask = new FutureTask<>(task);
提交到线程池或手动启动
由于 FutureTask 实现了 Runnable,可以直接交给 ExecutorService 执行,也可以自己新建线程调用 start()(不推荐,失去线程池管理优势)。
立即学习“Java免费学习笔记(深入)”;
推荐方式(使用线程池):
ExecutorService executor = Executors.newSingleThreadExecutor(); executor.submit(futureTask); // 或 executor.execute(futureTask)
注意:submit(FutureTask) 和 execute(FutureTask) 都可以,但前者更语义明确;submit(Callable) 内部其实也包装成了 FutureTask。
调用 get() 获取结果(阻塞/超时)
结果必须通过 futureTask.get() 获取。该方法会阻塞当前线程,直到任务完成;也可加超时避免无限等待。
-
futureTask.get():阻塞至完成,返回结果或抛出异常(如ExecutionException包装原始异常) -
futureTask.get(3, TimeUnit.SECONDS):最多等 3 秒,超时抛TimeoutException - 若任务被取消,调用
get()会抛CancellationException
建议始终用 try-catch 包裹 get(),处理 InterruptedException、ExecutionException 和 TimeoutException。
检查状态与取消任务
可通过以下方法判断任务进展:
-
isDone():任务是否已完成(正常结束、异常结束或被取消) -
isCancelled():任务是否被取消且未开始执行 -
cancel(true):尝试取消任务;参数true表示中断正在运行的线程(需任务逻辑响应中断)
注意:cancel() 返回 true 仅表示“取消请求成功发出”,不代表任务立即停止——实际是否终止取决于任务内部是否检查 Thread.interrupted() 并退出。


















