java中callable接口用于并发执行并获取返回值,其call()方法支持泛型返回值和受检异常,需配合executorservice和future使用,通过future.get()获取结果、isdone()检查状态、cancel()尝试中断。

Java 中 Callable 接口是解决“需要并发执行且获取返回结果”问题的核心工具,它比 Runnable 更进一步——支持泛型返回值和抛出受检异常。
Callable 与 Runnable 的关键区别
Callable 定义在 java.util.concurrent 包中,只有一个方法:V call() throws Exception。
对比 Runnable.run():无返回值、不能抛出受检异常。
这意味着 Callable 适合封装“有计算结果”的任务,比如远程调用、数据查询、数值计算等。
配合 Future 获取异步结果
单独使用 Callable 没法启动线程,必须交给线程池(如 ExecutorService)执行,它会返回一个 Future<v></v> 对象:
-
future.get():阻塞等待结果(可设超时),拿到call()的返回值 -
future.isDone():检查是否执行完成 -
future.cancel(true):尝试中断正在运行的任务
注意:get() 可能抛出 ExecutionException(包装任务内异常)、InterruptedException 或 TimeoutException,需妥善捕获。
实际代码示例
以下是一个计算阶乘并获取结果的典型用法:
ExecutorService executor = Executors.newFixedThreadPool(2);
Callable<long> task = () -> {
long result = 1;
for (int i = 1; i future = executor.submit(task);
try {
Long result = future.get(); // 阻塞直到完成
System.out.println("阶乘结果:" + result); // 输出 120
} catch (ExecutionException e) {
Throwable cause = e.getCause();
System.err.println("任务执行失败:" + cause.getMessage());
}
executor.shutdown();</long>
处理多个 Callable 任务
当有多个带返回值的任务时,推荐使用 invokeAll():
- 一次性提交多个
Callable,返回List<future>></future> - 所有任务并发执行,调用方按需遍历并调用
get() - 也可用
invokeAny()—— 返回第一个完成且未取消的任务结果,适合“竞速”场景(如多源接口调用取最快响应)
注意:如果某个任务抛出异常,get() 会封装为 ExecutionException 抛出,不影响其他任务。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











