futuretask是java中实现runnable与future接口的任务容器,支持包装callable或runnable任务,可提交执行、取消及获取结果;需显式启动,get()阻塞获取结果并处理异常,cancel()尝试取消任务。

Java 中用 FutureTask 包装异步任务,核心是把它当作一个“可提交、可取消、可获取结果”的任务容器,它同时实现了 Runnable 和 Future 接口,既能被线程执行,又能主动查询状态或取结果。
创建 FutureTask 的两种方式
它支持包装 Callable 或 Runnable 任务:
- 传入
Callable<v></v>:有返回值,推荐用于真正需要结果的异步计算(如远程调用、耗时计算) - 传入
Runnable+ 结果对象:无返回逻辑,但可通过构造时指定的 result 参数,在get()时返回该固定值(适合“只关心是否完成”的场景)
示例:
Callable<integer> task = () -> {
Thread.sleep(1000);
return 42;
};
FutureTask<integer> futureTask = new FutureTask(task);
</integer></integer>
启动任务:交给线程或线程池执行
FutureTask 本身不是线程,必须显式启动:
- 直接 new Thread(futureTask).start() —— 简单场景可用
- 更常用的是提交给
ExecutorService:executor.submit(futureTask) 或 executor.execute(futureTask)
注意:submit() 返回的仍是这个 futureTask,所以你可以复用它来查状态或取结果;而 execute() 不返回 Future,需自行持有引用。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
获取结果与处理异常
调用 get() 是阻塞操作,会等待任务完成再返回结果:
-
futureTask.get():无限等待,直到完成或被中断 -
futureTask.get(timeout, unit):带超时,避免永久卡住;超时抛TimeoutException
任务执行中若抛出异常(包括 RuntimeException),get() 会包装为 ExecutionException 抛出,其 getCause() 可拿到原始异常。
取消与状态判断
通过 cancel(boolean mayInterruptIfRunning) 尝试取消任务:
- 如果任务未开始,直接标记为已取消,
isCancelled()返回 true - 如果正在运行,且参数为
true,会尝试中断执行线程(需任务内部响应中断) -
isDone()表示任务已结束(含正常完成、取消、异常终止)
注意:cancel() 成功不代表立即停止,只是设置状态;是否真正中止取决于任务自身是否检查 Thread.interrupted() 并退出。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










