FutureTask 的 isCancelled() 方法用于判断任务是否被成功取消,仅当 cancel() 调用生效时返回 true,与任务是否运行无关;它区别于 isDone(),后者在任务完成、异常或取消时均返回 true。

在 Java 中,FutureTask 提供了 isCancelled() 方法来检测任务是否已被取消。
isCancelled() 是最直接的判断方式
isCancelled() 返回 true 当且仅当任务在正常完成前被显式调用 cancel(true) 或 cancel(false) 取消,并且该取消操作成功生效。注意:它不关心任务是否已启动、是否正在运行,只反映“取消请求是否已被接受并生效”。
- 即使任务已经运行完毕(包括正常结束或抛出异常),只要没被取消过,
isCancelled()就返回false - 如果任务尚未开始执行就被取消,
isCancelled()立即返回true - 如果任务正在运行中,且调用
cancel(true)并成功中断了线程,isCancelled()也返回true
cancel() 调用后需配合 isCancelled() 检查结果
cancel(boolean mayInterruptIfRunning) 方法本身返回 boolean,表示取消是否“成功”——即任务此前未完成且尚未开始执行(或可被中断)。但这个返回值仅反映取消动作的即时效果,不能替代后续的状态检查。
- 建议在调用
cancel(...)后,再调用isCancelled()确认最终状态 - 例如:不要仅依赖 cancel() 的返回值做逻辑分支,而应以 isCancelled() 为准
注意与 isDone() 的区别
isDone() 表示任务已结束(无论完成、异常还是被取消),而 isCancelled() 是其子集——只有被取消才算 true,正常完成或异常终止都返回 false。
立即学习“Java免费学习笔记(深入)”;
-
isCancelled() == true⇒ 必然有isDone() == true -
isDone() == true⇏isCancelled() == true(可能是正常返回或抛异常) - 若需区分“取消”和“完成”,必须同时检查两个方法
实际使用中的典型场景
常见于超时控制、用户主动中止、资源清理等逻辑中:
- 提交任务后启动定时器,超时时调用
future.cancel(true) - 轮询检查
future.isCancelled()判断是否已被外部取消 - 在
get()前先确认状态,避免不必要的阻塞或CancellationException - 任务内部也可定期调用
Thread.interrupted()或检查isCancelled()实现协作式中断


















