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

JavaSE 面试题 46-50

使用runnable需重写run方法,而且返回值为viod型,等于没有返回值;

Thread 类在调用 start()函数后就是执行的 是 Runnable 的 run()函数。

callable需重写call方法,call方法可以有返回值,支持泛型而且可以捕获解决异常;

sleep和wait都是线程等待的方法

sleep是使的当前线程休眠一段时间,让出cpu的同时,不释放锁对象(资源)

wait方法是将锁对象和cpu同时释放,只有执行notify方法后,才可以进入获取锁队列;

notify():唤醒单个线程,但是如果后多个线程在等待,只唤醒其中某一个,由jvm确定环形的线程;

notifyall():将所有待唤醒的线程全部唤醒,并等价于将其排入等待队列,让所有进程竞争锁对象,只有抢占到锁对象好的线程才能执行

1. 返回值

  • submit()方法:可以提交RunnableCallable类型的任务。对于Runnable任务,submit()方法会返回一个Future<?>对象;对于Callable任务,submit()方法会返回一个Future<T>对象,其中TCallable任务的返回类型。这个Future对象可以用来检查任务是否完成、等待任务完成以及获取任务的结果。
  • execute()方法:只接受Runnable类型的任务,并且不返回任何值。因此,你无法通过execute()方法提交的任务来获取其执行结果。

2. 异常处理

  • submit()方法:如果任务执行过程中抛出了异常,这个异常会被封装在Future对象中。当你调用Future.get()方法来获取任务结果时,如果任务已经执行完成但抛出了异常,那么get()方法会抛出ExecutionException。这使得你可以通过捕获这个异常来处理任务执行过程中的错误。
  • execute()方法:如果任务执行过程中抛出了未检查的异常(RuntimeExceptionError),那么这个异常会被线程池捕获并记录,但不会被传播给提交任务的线程。如果任务执行过程中抛出了已检查的异常,并且这个异常没有被任务内部捕获,那么线程池会将其包装为RejectedExecutionException(尽管这通常与任务提交时的拒绝策略相关,而不是任务执行时的异常处理)。然而,对于execute()方法来说,更常见的是异常被任务内部捕获或忽略,因为execute()不提供直接的方式来获取任务执行的结果或异常。

3. 灵活性

  • submit()方法:由于它支持Callable接口,因此可以提交需要返回结果的任务。此外,submit()方法提供的Future对象使得你可以更灵活地控制任务的执行和结果的获取。
  • execute()方法:只支持Runnable接口,因此只能提交不需要返回结果的任务。这使得它在某些场景下(如只需要执行某些操作而不需要关心结果时)更加简单和轻量级。

4. 适用性

  • submit()方法:适用于需要获取任务执行结果或进行更复杂的异步操作控制的场景。
  • execute()方法:适用于那些不需要返回结果,或者需要更简单、更轻量级地执行任务的场景。

5. 兼容性

需要注意的是,有说法认为从Java 5开始,execute()方法已经被弃用,并建议使用submit()方法代替。然而,这种说法是不准确的。在Java的官方文档中,execute()方法并没有被弃用,它仍然是ExecutorService接口的一部分,并且被广泛使用。因此,在选择使用submit()还是execute()方法时,应该根据具体的需求和场景来决定。

综上所述,submit()execute()方法在Java线程池中都扮演着重要的角色,但它们各自具有不同的特点和适用场景。开发者应该根据实际需求来选择合适的方法。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 力扣题解(跳跃游戏II)
  • 关于linux上root连接mysql时遇到的一点小问题以及rsync通过ssh的文件同步传输以及免密码传输的实现
  • C++系列-多态的基本语法
  • 【Linux —— 生产者消费者模型】
  • 47.【C语言】指针(重难点)(J)
  • 【渗透测试】ATTCK靶场一,phpmyadmin,域渗透,内网横向移动攻略
  • Unity动画模块 之 动画层混合
  • 我要做全栈:自学前端第一天
  • Go开发桌面客户端软件小试:网站Sitemap生成
  • client网络模块的开发和client与server端的部分联动调试
  • 流体力学解迷宫
  • 【ZYNQ MPSoC开发】PS裸机多核程序的固化
  • 计算机毕业设计选题推荐-体育馆场地预约系统-Java/Python项目实战
  • 学习MyBatis-Plus
  • (一) 初入MySQL 【认识和部署】
  • 08.Android之View事件问题
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • Java小白进阶笔记(3)-初级面向对象
  • js ES6 求数组的交集,并集,还有差集
  • overflow: hidden IE7无效
  • Redis 懒删除(lazy free)简史
  • spring security oauth2 password授权模式
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • webpack入门学习手记(二)
  • zookeeper系列(七)实战分布式命名服务
  • 高度不固定时垂直居中
  • 前端面试之CSS3新特性
  • 悄悄地说一个bug
  • 探索 JS 中的模块化
  • Hibernate主键生成策略及选择
  • Mac 上flink的安装与启动
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • #Linux(权限管理)
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (35)远程识别(又称无人机识别)(二)
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (三)模仿学习-Action数据的模仿
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (转)关于pipe()的详细解析
  • .gitignore文件---让git自动忽略指定文件
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .NET/C#⾯试题汇总系列:集合、异常、泛型、LINQ、委托、EF!(完整版)
  • .NET中分布式服务
  • .so文件(linux系统)
  • [@Controller]4 详解@ModelAttribute
  • [1]从概念到实践:电商智能助手在AI Agent技术驱动下的落地实战案例深度剖析(AI Agent技术打造个性化、智能化的用户助手)
  • [20160902]rm -rf的惨案.txt