0

0

在Java里Callable接口和Runnable有什么区别_Java线程返回值解析

P粉602998670

P粉602998670

发布时间:2026-02-10 11:37:53

|

519人浏览过

|

来源于php中文网

原创

Callable能返回值且可抛受检异常,Runnable不能:Callable的call()有泛型返回值并支持throws声明,需通过Future.get()获取结果并处理ExecutionException;Runnable的run()返回void、不支持受检异常,提交后Future.get()恒返回null。

在java里callable接口和runnable有什么区别_java线程返回值解析

Callable 能返回值,Runnable 不能

这是最直接的区别:Callablecall() 方法有返回值(类型由泛型指定),而 Runnablerun() 方法返回 void。如果你需要线程执行完后拿到结果(比如计算结果、查询响应、状态码),必须用 Callable

常见错误现象:试图在 Runnable 里写 return "done" —— 编译直接报错,因为方法签名不允许返回值。

  • Callablecall() 可以返回 "success"
  • Runnablerun() 只能执行逻辑,结果得靠外部变量、回调或共享容器“塞出去”
  • 返回值不是立刻拿到的,要通过 Future.get() 获取,这会阻塞当前线程(除非用 isDone() 或超时重试)

Callable 声明受检异常,Runnable 不行

call() 方法允许抛出受检异常(Exception 及其子类),而 run() 方法签名禁止这么做——它只能抛运行时异常(RuntimeException)或错误(Error)。

使用场景:比如线程内做文件读取、HTTP 请求,这些操作天然抛 IOExceptionInterruptedException。用 Runnable 就得包一层 try-catch 吞掉或转成 RuntimeException;用 Callable 可以原样往上抛,由调用方决定怎么处理。

立即学习Java免费学习笔记(深入)”;

  • new Callable() { public Integer call() throws IOException { ... } } 是合法的
  • 同理写 throws InterruptedException 也没问题
  • Runnablerun() 方法体里写 throw new IOException() 会编译失败

提交到线程池后,返回类型不同

ExecutorService 提交任务时,返回对象类型决定了你能否获取结果:

讯飞绘文
讯飞绘文

讯飞绘文:免费AI写作/AI生成文章

下载
  • executor.submit(new Runnable() {...}) → 返回 Future>,但 get() 总是返回 null
  • executor.submit(new Callable() {...}) → 返回 Futureget() 返回实际结果
  • 注意:即使传入 Runnable + result(即 submit(Runnable, T) 重载),也是把那个 result 当作“默认返回值”,不是线程执行产生的

性能影响:Future.get() 是同步阻塞调用,如果没设置超时且任务卡住,调用线程就一直挂起。别在主线程或 I/O 密集路径上无脑 get()

为什么不能直接用 Thread 启动 Callable

Thread 构造器只接受 Runnable,不支持 Callable。想让 Callable 跑起来,必须借助 FutureTask 包装——它既是 Runnable(可被 Thread 执行),又实现了 Future(提供 get())。

容易踩的坑:

  • new Thread(new Callable<...>() {...}) → 编译失败
  • 正确做法:FutureTask task = new FutureTask(callable); new Thread(task).start(); String result = task.get();
  • 重复调用 task.get() 没问题,但第一次之后的结果是缓存的;若第一次调用时任务抛异常,后续 get() 会重新抛出包装后的 ExecutionException

真正复杂的地方不在接口定义,而在结果获取时机和异常传播链——Callable 抛的异常会被包进 ExecutionException,需要用 getCause() 解包才能看到原始异常。这点常被忽略。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

668

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

243

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

663

2024.03.01

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

243

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

663

2024.03.01

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

331

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

325

2023.10.25

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

180

2023.11.23

TensorFlow2深度学习模型实战与优化
TensorFlow2深度学习模型实战与优化

本专题面向 AI 与数据科学开发者,系统讲解 TensorFlow 2 框架下深度学习模型的构建、训练、调优与部署。内容包括神经网络基础、卷积神经网络、循环神经网络、优化算法及模型性能提升技巧。通过实战项目演示,帮助开发者掌握从模型设计到上线的完整流程。

0

2026.02.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.4万人学习

C# 教程
C# 教程

共94课时 | 9万人学习

Java 教程
Java 教程

共578课时 | 61.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号