futuretask.isdone()轮询需配合executorservice提交任务并适度休眠,isdone()返回true仅表示任务结束(含成功、异常或取消),不区分结果类型;错误直接run会导致isdone()恒为false。

用 FutureTask.isDone() 在主循环中非阻塞轮询,核心是避免调用 get() 阻塞,只靠 isDone() 查状态,配合小间隔休眠控制 CPU 占用。
确认任务已提交并持有 FutureTask 引用
必须先用线程池(如 ExecutorService)提交 FutureTask,不能直接 new 后 run —— 否则 isDone() 永远返回 false,因为没被线程执行或未标记完成。
- 正确方式:
FutureTask<string> task = new FutureTask(()->"done"); executor.submit(task);</string> - 错误方式:
new FutureTask(()->"done").run();—— 此时 isDone() 仍为 false,因未走 Executor 的完成机制
主循环中轮询 + 适度休眠
isDone() 是轻量级方法,可高频调用,但空转太猛会吃 CPU。建议加 Thread.sleep(10) 或更短(如 1~5ms),具体看响应要求。
- 单个任务示例:
while (!task.isDone()) {
try { Thread.sleep(5); } catch (InterruptedException e) { return; }
}
// 此时可安全 get(),不会阻塞
String result = task.get();
- 多个任务:用集合存所有
FutureTask,每次遍历检查是否全部isDone()为true
注意 isDone() 的语义边界
isDone() 返回 true 表示任务已结束——包括正常完成、抛出异常、或被取消(cancel(true) 成功后)。它不区分成功/失败,只反映“不再运行”。
- 若需区分结果类型,轮询结束后再调
get()并捕获ExecutionException(包装业务异常)或CancellationException - 不要依赖
isDone()判断“是否成功”,那是isCancelled()和后续get()的职责
更优替代方案(按场景推荐)
纯轮询虽简单,但有更好选择:
- 想等全部完成且不阻塞主线程?用
CompletableFuture.allOf(...).join()配合异步回调 - 要低延迟响应完成事件?用
ExecutorCompletionService,它内部用阻塞队列主动推送完成任务 - 只是防止忙等浪费 CPU?轮询 + sleep 已足够,无需过度设计











