Java中用Callable和Future创建有返回值的线程,核心是通过ExecutorService提交Callable任务获取Future对象;Callable支持泛型返回值和受检异常,Future提供get()阻塞获取结果、isDone()检查完成状态、cancel()尝试取消任务等功能。

Java 中用 Callable 和 Future 创建有返回值的线程,核心是借助线程池(ExecutorService)提交 Callable 任务,获得 Future 对象来获取结果。
定义 Callable 任务
Callable 是一个函数式接口,和 Runnable 类似,但支持泛型返回值,且允许抛出受检异常。
示例:计算两个整数的和并返回结果
Callable<Integer> task = () -> {
Thread.sleep(1000); // 模拟耗时操作
return 10 + 20;
};
提交任务并获取 Future
必须通过 ExecutorService 提交 Callable,不能直接 new 线程。常用线程池如 Executors.newFixedThreadPool(1)。
立即学习“Java免费学习笔记(深入)”;
提交后返回 Future<t></t>,它代表异步计算的结果:
-
future.get():阻塞等待结果(可设超时),若任务未完成会一直等; -
future.isDone():检查是否执行完毕; -
future.cancel(true):尝试取消任务(仅对未开始或运行中的任务有效)。
完整可运行示例
import java.util.concurrent.*;
public class CallableExample {
public static void main(String[] args) throws Exception {
ExecutorService executor = Executors.newSingleThreadExecutor();
Callable<String> task = () -> {
Thread.sleep(2000);
return "Hello from Callable!";
};
Future<String> future = executor.submit(task);
System.out.println("任务已提交,主线程继续执行...");
// 获取结果(会阻塞直到任务完成)
String result = future.get(); // 或 future.get(3, TimeUnit.SECONDS) 加超时
System.out.println("结果:" + result);
executor.shutdown();
}
}
注意事项
-
Callable的call()方法必须有返回值,不能是void; -
Future.get()是阻塞调用,生产环境建议加超时,避免无限等待; - 任务抛出的异常会被包装进
ExecutionException,需捕获处理; - 用完线程池记得调用
shutdown()或shutdownNow()释放资源。


















