FutureTask 是 Java 中实现 Runnable 和 Future 接口的异步任务包装类,支持结果获取、状态查询与取消;需手动执行(如通过 Thread 或线程池),不可重复调用 run(),也不宜多线程共享。

FutureTask 是 Java 中用于包装异步计算任务的核心类之一,它实现了 Runnable 和 Future 接口,既能被线程执行,又能获取结果、判断状态、取消任务。使用它,你不需要直接操作线程,也不依赖高级框架(如 CompletableFuture),适合轻量、可控的异步场景。
创建 FutureTask 的两种方式
FutureTask 本质是“可运行的未来结果”,必须用一个能产生结果的任务来初始化:
-
用 Callable 创建:最常用,支持返回值和异常处理。
FutureTasktask = new FutureTask(() -> { Thread.sleep(1000); return "done"; }); -
用 Runnable + result 创建:适用于无需真正计算、只需触发动作并返回固定结果的场景。
FutureTasktask = new FutureTask(()-> System.out.println("run"), 42);
提交任务并获取结果
FutureTask 自身不是线程,需交给 Thread 或线程池执行。执行后通过 get() 获取结果:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。
- 调用
get()会阻塞,直到任务完成;若任务抛异常,get()将抛出ExecutionException包装原异常。 - 可用
get(long timeout, TimeUnit unit)设置超时,避免无限等待。 - 任务未启动时调用
get()不会报错,但会一直阻塞,直到有人调用run()—— 所以务必确保它已被执行。
手动控制任务生命周期
FutureTask 提供了对任务状态的精细控制能力:
立即学习“Java免费学习笔记(深入)”;
-
isDone():任务已结束(正常完成、异常或被取消)返回 true。 -
isCancelled():任务在运行前被取消才返回 true;运行中调用cancel(true)可尝试中断线程,但是否生效取决于任务内部是否响应中断。 -
cancel(boolean mayInterruptIfRunning):true 表示尝试中断正在运行的线程,false 表示只取消尚未开始的任务。
常见误用提醒
FutureTask 容易被当成“自动异步工具”,但它的异步性完全依赖外部执行机制:
- 只 new 出来不 run,任务永远不会执行,
get()会永远阻塞。 - 重复调用
run()无效:FutureTask 状态只能从 NEW → COMPLETING → NORMAL/EXCEPTIONAL/CANCELLED,不可重置。 - 不要把同一个 FutureTask 提交到多个线程:它不是线程安全的“可重入任务”,多线程调用
run()可能导致状态混乱或静默失败。


















