isdone() 仅表示任务生命周期终结,非进度指标;它返回true涵盖正常完成、异常终止、主动取消三种互斥终态,不反映中间状态或百分比进度,精准监控需任务内部暴露进度机制。

isDone() 不是进度判断工具,而是完成状态探针——它只回答“任务是否已彻底结束”,不反映“执行到哪一步了”。想精准掌握进度,不能依赖 isDone(),而要结合任务设计与状态暴露机制。
isDone() 的真实含义:三态终结,非进度指标
isDone() 返回 true 仅表示任务生命周期终止,涵盖以下三种互斥情况:
- 正常返回结果(状态变为 NORMAL)
- 执行中抛出未捕获异常(状态变为 EXCEPTIONAL)
- 被主动取消且成功(状态变为 CANCELLED 或 INTERRUPTED)
它不提供中间状态(如 RUNNING、QUEUED),也不暴露耗时百分比、步骤编号或处理条目数。调用 isDone() 一百次,只要任务没结束,结果始终是 false;一旦结束,就永远是 true —— 它没有“90% 完成”这样的渐进值。
真正能反映进度的替代方案
若需监控执行过程(例如“已处理 127/500 条记录”),需在任务内部主动暴露进度,常见做法包括:
-
共享原子变量:在 Callable 中维护一个
AtomicInteger progress,每处理一项就incrementAndGet();主线程定时读取该值 -
回调式通知:定义接口如
ProgressListener.onProgress(int current, int total),由任务内部触发,避免轮询 -
封装可观察任务类:继承 FutureTask 或组合 Callable,添加
getProgress()方法并同步保护内部计数器
注意:这些方式都需任务逻辑本身支持,isDone() 无法替代它们。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
isDone() 的正确使用场景
它适合用于“守门人”式判断,即确认任务已退出运行,可安全执行后续动作:
- 轮询结束后调用
get()取结果(此时不会阻塞) - 配合
isCancelled()区分是失败退出还是主动终止 - 多任务协调中判断“是否全部退出”,再统一收集结果或清理资源
例如:提交 10 个 FutureTask 后,用 allTasks.stream().allMatch(Future::isDone) 判断是否都已结束,再批量 get() 或查异常。
常见误用及规避要点
以下操作会让 isDone() 失效或误导判断:
- 直接 new FutureTask(...).run():绕过线程池,状态不会更新,isDone() 永远为 false
-
空转轮询 while(!task.isDone()):CPU 占满,应加
Thread.sleep(5–50)控制频率 -
把 isDone()==true 当作“成功完成”:必须再调
get()并捕获ExecutionException或检查isCancelled()
真正需要进度感知时,请重构任务逻辑,而非试图从 isDone() 挖掘不存在的信息。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










