Java中通过Callable定义带返回值的任务,用FutureTask包装并提交执行以获取异步结果;Callable的call()支持泛型返回值和受检异常,FutureTask兼具Runnable和Future特性,提供get()阻塞获取结果、状态判断与任务取消功能。

Java 中通过 Callable 定义带返回值的任务,再用 FutureTask 包装并提交给线程执行,从而获得异步计算结果。
Callable 替代 Runnable,支持返回值和异常
Runnable 的 run() 方法无返回值、不能抛出受检异常;Callable 的 call() 方法可返回任意类型结果(泛型指定),且允许抛出 Exception。这是实现“有结果的线程任务”的基础。
例如:
Callable<Integer> task = () -> {Thread.sleep(1000);
return 42;
};
FutureTask 是 Runnable + Future 的桥梁
FutureTask 实现了 Runnable 和 Future 接口,既能被线程直接执行(因是 Runnable),又能获取结果、判断状态、取消任务(因是 Future)。
立即学习“Java免费学习笔记(深入)”;
关键点:
- 构造时传入 Callable,内部封装执行逻辑和结果容器
- 调用 start() 或 submit() 后,call() 在新线程中执行
- get() 方法会阻塞直到结果就绪,支持超时和中断处理
两种典型使用方式
方式一:手动启动线程
FutureTask<String> ft = new FutureTask<>(() -> {return "done";
});
new Thread(ft).start();
String result = ft.get(); // 阻塞等待
方式二:提交到线程池(更常用)
ExecutorService es = Executors.newCachedThreadPool();Future<Integer> future = es.submit(() -> {
return 100 * 2;
});
int result = future.get(); // 获取结果
es.shutdown();
注意 get() 的阻塞与异常处理
Future.get() 可能抛出三种异常:
- CancellationException:任务被取消后调用 get()
- ExecutionException:call() 内部抛出的异常被包装后抛出
- InterruptedException:当前线程在等待时被中断
建议始终捕获 ExecutionException 并检查其 cause,以便定位业务逻辑中的错误。


















