Runnable不能返回结果、不能抛出受检异常;Callable可以返回泛型结果、能抛出任意异常。前者适用于日志记录等无反馈场景,后者适用于计算任务、远程调用等需结果与异常处理的场景。
Callable 和 Runnable 最核心的区别是:Runnable 不能返回结果、不能抛出受检异常;Callable 可以返回结果、能抛出受检异常。这个差异直接决定了它们在不同场景下的适用性。
Runnable 的 run() 方法返回 void,执行完没有结果可获取;Callable 的 call() 方法有泛型返回值(比如 Callable
Runnable 的 run() 方法只能抛出运行时
异常(RuntimeException 及其子类);Callable 的 call() 方法可以声明抛出任意异常(包括 IOException、SQLException 等受检异常)。
Runnable 可直接传给 Thread 构造器启动;Callable 不能直接交给 Thread,必须配合 ExecutorService 使用,通过 submit() 返回 Future 对象来获取结果或控制生命周期。
不追求结果、不涉及受检异常 → 优先用 Runnable,轻量简洁;需要结果、要处理 IO/SQL 等异常、需超时控制或取消任务 → 选 Callable + Future/CompletableFuture。
基本上就这些。两者不是替代关系,而是分工明确:Runnable 做“事”,Callable 做“有结果的事”。