线程池通过submit(callable)自动创建并返回future对象,支持isdone()、iscancelled()等状态判断;cancel(true)仅发送中断信号,任务是否停止取决于其是否响应中断。

线程池本身不直接“配合”FutureTask,而是通过 submit(Callable) 方法自动创建并管理一个 Future 实例(底层常是 FutureTask),你拿到的就是具备状态查询能力的 Future 对象。
用 submit(Callable) 获取可查状态的 Future
这是最常用、最推荐的方式。ExecutorService 的 submit 方法接收 Callable,返回 Future,无需手动 new FutureTask:
- Callable 定义带返回值和异常的任务逻辑
- submit 后立即返回 Future,此时任务可能还没开始执行
- 该 Future 天然支持 isDone()、isCancelled() 等状态判断方法
关键状态判断方法怎么用
Future 接口提供三个核心状态相关方法,注意它们的语义差异:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- isDone():任务已结束(无论成功、异常或被取消),返回 true
- isCancelled():任务在完成前被 cancel(true/false) 主动取消,返回 true
- 注意:isDone() 为 true 时,isCancelled() 不一定为 true;但 isCancelled() 为 true 时,isDone() 一定为 true
实际检查状态的典型场景
避免盲目调用 get() 阻塞,可先判断再操作:
- 任务刚提交,想快速确认是否已跑完:if (future.isDone()) { result = future.get(); }
- 执行中想主动放弃:if (!future.isDone() && future.cancel(true)) { System.out.println("已尝试中断"); }
- 批量提交后轮询结果:对多个 future 调用 isDone(),只对已完成的 get(),避免整体等待
cancel() 对运行中任务的影响
调用 future.cancel(true) 并不等于“立刻停止任务”,它本质是向执行线程发中断信号:
- 如果任务内部响应中断(比如检查 Thread.interrupted() 或在 sleep/wait 中被唤醒),才会提前退出
- 如果任务是纯计算、无中断检查、也未调用阻塞方法,cancel(true) 不会中断其执行,只是标记为“已取消”,等它自然跑完
- cancel(false) 则只标记取消,完全不影响正在运行的线程
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










