Callable与Runnable的核心区别在于:Callable有返回值且能抛受检异常,而Runnable没有;Callable需通过FutureTask或线程池提交获取Future,再调用get()获取结果,不能直接传给Thread构造器。

Java 中的 Callable 接口 是一个函数式接口,用来定义一个**可以返回结果、还能抛出受检异常**的多线程任务。
它和 Runnable 的核心区别在哪
Runnable 的 run() 方法没有返回值、不能抛出受检异常;Callable 的 call() 方法有泛型返回值、能 throw Exception。这意味着:
- 你需要结果时——用 Callable(比如计算 1 到 1000 的和,要拿到 sum)
- 你只关心“做了没”,不关心“做了啥”——用 Runnable 更轻量
- call() 方法执行完,结果不是直接给主线程,而是通过 Future 对象来取
为什么不能直接 new Thread(new Callable())
因为 Thread 构造器只接受 Runnable 类型参数。Callable 必须借助适配器——FutureTask:
- FutureTask 实现了 Runnable 和 Future 两个接口
- 它把 Callable 包装成 Runnable,让 Thread 能执行
- 同时自己实现了 Future,提供 get()、isDone()、cancel() 等方法来管理结果和状态
一个最简可用的例子
计算 1+2+…+1000,并在主线程中拿到结果:
大高朋团购系统是一套Groupon模式的开源团购程序,开发的一套网团购程序,系统采用ASP+ACCESS开发的团购程序,安装超简,功能超全面,在保留大高朋团购系统版权的前提下,允许所有用户免费使用。大高朋团购系统内置多种主流在线支付接口,所有网银用户均可无障碍支付;短信发送团购券和实物团购快递发货等。 二、为什么选择大高朋团购程序系统? 1.功能强大、细节完善 除了拥有主流团购网站功能,更特别支
立即学习“Java免费学习笔记(深入)”;
Callabletask = () -> { int sum = 0; for (int i = 1; i <= 1000; i++) sum += i; return sum; }; FutureTask ft = new FutureTask<>(task); new Thread(ft).start(); System.out.println(ft.get()); // 阻塞等待,输出 500500
实际开发中更推荐怎么用
单独用 FutureTask + Thread 属于“底层写法”,现在主流是交给线程池:
- ExecutorService.submit(Callable) 直接返回 Future
- 避免手动创建线程,复用资源,支持批量提交、超时控制、异常捕获
- 后续还可升级为 CompletableFuture 做链式异步编排
基本上就这些。Callable 不复杂,但容易忽略它必须搭配 Future 才能落地这个关键点。










