isdone()返回true表示任务已结束(含成功、异常或取消),不区分结果类型;需配合iscancelled()判断是否被取消,或通过get()异常类型反推状态。

Java 中 FutureTask 提供了多种方式查询任务是否完成,核心是通过其继承自 Future 接口的几个关键方法。
使用 isDone() 判断任务是否已结束
isDone() 是最直接的判断方式,只要任务处于「已完成」状态(无论正常结束、异常终止或被取消),该方法都返回 true。注意:它不区分成功、失败或取消,只反映执行生命周期是否终结。
- 任务调用
run()后正常返回 →isDone()返回true - 任务执行中抛出未捕获异常 →
isDone()仍返回true - 任务被
cancel(true)成功中断 →isDone()也返回true
结合 isCancelled() 区分是否被主动取消
当 isDone() 为 true 时,可进一步调用 isCancelled() 判断是否因调用 cancel(...) 而提前终止。如果返回 true,说明任务未执行完毕就被取消;否则表示任务已自然完成(含异常完成)。
注意:isCancelled() 为 true 时,get() 会抛出 CancellationException,不能获取结果。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
调用 get() 并捕获超时或异常来间接感知状态
get() 方法在任务未完成时会阻塞,而 get(long, TimeUnit) 可设置超时。若超时前任务未完成,会抛出 TimeoutException;若已完成但失败,抛出 ExecutionException(包装原始异常);若被取消,则抛出 CancellationException。
因此,通过异常类型也能反推当前状态:
- 捕获
TimeoutException→ 任务仍在运行 - 捕获
ExecutionException→ 任务已完成但执行出错 - 捕获
CancellationException→ 任务已被取消 - 正常返回结果 → 任务成功完成
避免轮询,优先使用回调或 CompletionService
频繁调用 isDone() 属于忙等待,效率低且浪费 CPU。实际开发中更推荐:
- 提交任务后直接调用
get()(适合必须等待结果的场景) - 使用
ExecutorService.invokeAll()或CompletionService统一收集完成结果 - Java 8+ 可考虑
CompletableFuture,支持异步回调(如thenApply、whenComplete),状态响应更自然
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










