Runnable无返回值,Callable有返回值;2. Runnable不抛受检异常,Callable可抛;3. 提交方式不同,Callable通过submit获取Future结果;4. Callable支持泛型。需返回或异常处理选Callable,否则用Runnable。

在 Java 中,Runnable 和 Callable 都是用来表示可以被线程执行的任务,但它们有几个关键区别。
1. 是否有返回值
Runnable 的 run() 方法没有返回值,只能通过共享变量或回调方式传递结果。它适用于不需要返回结果的异步任务。
Callable 的 call() 方法有返回值,可以通过 Future 获取任务执行结果。适合需要获取执行结果的场景。
2. 是否抛出异常
Runnable 的 run() 方法不能抛出受检异常(checked exception),只能捕获处理或抛出运行时异常。
立即学习“Java免费学习笔记(深入)”;
Callable 的 call() 方法允许抛出受检异常,比如 IOException 等,调用方可以通过 Future.get() 捕获 ExecutionException 来获取异常信息。
3. 使用的线程池方法不同
提交 Runnable 任务通常使用 executor.execute(runnable) 或 executor.submit(runnable),后者返回的 Future 对象结果为 null。
提交 Callable 任务使用 executor.submit(callable),返回的 Future 对象可以通过 get() 方法获取 call() 的返回值。
4. 泛型支持
Callable 是泛型接口,定义为 Callable
Runnable 不是泛型接口,无法指定返回类型。
基本上就这些。如果你的任务需要返回结果或可能抛出受检异常,优先选择 Callable;否则 Runnable 更简洁。两者都能在线程池中使用,但配套的 API 略有不同。











