当前位置: 首页 > news >正文

面试题:callable与runable的区别?

        Callable和Runnable是Java中用于创建线程和执行任务的两种不同的接口,他们之间有几个关键的区别:

1.返回值:

        Runnable接口定义了一个无返回值的run()方法。这意味着你无法从执行run()方法的线程获取任何结果。

        Callable接口定义了一个call()方法,此方法可以返回一个泛型类型的结果。你可以通过Future对象获取这个结果。

2.异常处理: 

        Runnable的run()方法不能声明抛出受检查异常(checked execeptions)。任何run()方法重抛出的受检查异常都会被封装成UndelaredThrowableError或UndeclaredRuntimeException,并由JVM自动处理。

        Callable的call()方法可以声明抛出收检查异常。调用者可以调用Future.get()方法处理这些异常,

3.使用方式

        实现Runnable的类可以直接传递给Thread的构造函数,然后通过Thread.start()方法启动线程。

        实现Callable的类不能直接用来创建Thread对象,需要借助FutureTask包装器。FutureTask是一个包装器类,它同时实现了RunnableFuture接口,允许我们通过Future的API来管理 callable 任务,包括获取结果和取消执行等。创建了FutureTask之后,可以像使用Runnable那样将它传递给Thread,或者提交给ExecutorService来执行。

4.结果获取:

        由于Runnable没有返回值,所以没有直接的方式获取执行结果。

        对于Callable任务,通过FutureTask.get()方法可以获取到线程执行结束后的结果,这个方法会阻塞直到结果可用。

5.总结:

        总结来说,如果你需要线程执行后返回一个结果或者需要能够抛出和处理检查型异常,你应该使用Callable接口配合FutureTask;如果不需要返回结果且不需要处理特定的异常,使用Runnable接口会更加简单。        

相关文章:

  • python中字典的创建
  • Spring AI 第二讲 之 Chat Model API 第九节 watsonx.ai Chat
  • 微生物实验室建设公司独家分享:从平面布局到高效设备的全流程设计技巧
  • YOLOV5总结
  • C++基础编程100题-009 OpenJudge-1.3-07 计算多项式的值
  • 协程-在单个线程内部执行
  • 为什么要分析电商用户数据?详解两大用户数据分析维度
  • 华为云DDoS攻击下的应对策略
  • Spring Cloud Gateway详解
  • BIO NIO AIO 的区别!!!
  • 【Oracle生产运维】表空间利用率不足处理
  • RabbitMQ-工作模式(Topics模式RPC模式Publisher Confirms模式)
  • docker使用auth登录
  • LeetCode | 26.删除有序数组中的重复项
  • 【深度学习】深度学习之巅:在 CentOS 7 上打造完美Python 3.10 与 PyTorch 2.3.0 环境
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 230. Kth Smallest Element in a BST
  • 30天自制操作系统-2
  • CODING 缺陷管理功能正式开始公测
  • Git初体验
  • JavaScript的使用你知道几种?(上)
  • k8s 面向应用开发者的基础命令
  • KMP算法及优化
  • leetcode388. Longest Absolute File Path
  • Linux CTF 逆向入门
  • Python学习笔记 字符串拼接
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 浮现式设计
  • 记录一下第一次使用npm
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 精彩代码 vue.js
  • 排序算法之--选择排序
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • -- 数据结构 顺序表 --Java
  • 详解移动APP与web APP的区别
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • 怎么把视频里的音乐提取出来
  • 追踪解析 FutureTask 源码
  • const的用法,特别是用在函数前面与后面的区别
  • ​520就是要宠粉,你的心头书我买单
  • ​MySQL主从复制一致性检测
  • ​批处理文件中的errorlevel用法
  • ​字​节​一​面​
  • # 利刃出鞘_Tomcat 核心原理解析(七)
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • (06)金属布线——为半导体注入生命的连接
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (五)Python 垃圾回收机制
  • (一)Kafka 安全之使用 SASL 进行身份验证 —— JAAS 配置、SASL 配置
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • (转载)虚函数剖析