【问答篇】Java 线程篇 面试题(一)

news2024/7/6 18:49:10

每天进步一点~

(ps: 文章内容及图片出处来自本人公众号~)

01、问:请谈谈你对并发编程优缺点的认识与理解 ~

答:

优点:充分利用多核CPU的计算能力,通过并发编程的形式将多核CPU的计算能力发挥到极致,性能得到提升。

方便进行业务的拆分。提高系统并发能力和性能:高并发系统的开发,并发编程会显得尤为重要,利用好多线程机制可以大大提高系统的并发能力及性能;面对复杂的业务模型,并行程序会比串行程序更适应业务需求,而并发编程更适合这种业务拆分。

缺点:并发编程的目的是为了提高程序的执行效率,提高程序运行速度,但并发编程并不是总能提高性能,有时还会遇到很多问题,例如:内存泄漏,线程安全,死锁等。

02、问:请简要描述一下并发编程的三要素

答:

原子性:原子是不可再分割的最小单元,原子性是指一个或多个操作要么全部执行成功,要么全部执行失败。

可见性:一个线程对共享变量的修改,另一个线程能看到(synchronized,volatile)

有序性:程序的执行顺序按照代码的先后顺序

线程安全的问题原因有:

1. 线程切换带来的原子性问题

2. 缓存导致的可见性问题

3. 编译优化带来的有序性问题

解决方案:

1.JDK Atomic开头的原子类、synchronized、LOCK,可以解决原子性问题

2.synchronized、volatile、LOCK,可以解决可见性问题

3.Happens-Before 规则可以解决有序性问题

03、问:并发和并行有什么区别吗?

答:

并发:多个任务在同一个CPU上,按照细分的时间片轮流交替执行,由于时间很短,看上去好像是同时进行的。

并行:单位时间内,多个处理器或多核处理器同时处理多个任务,是真正意义上的同时进行。

串行:有n个任务,由一个线程按照顺序执行。

04、​​​​​​​问:谈谈什么是多线程 以及 多线程的优劣势?

答:定义:多线程是指程序中包含多个流,即在一个程序中可以同时进行多个不同的线程来执行不同的任务。

优点:

可以提高CPU的利用率,在多线程中,一个线程必须等待的时候,CPU可以运行其它线程而不是等待,这样就大大提高了程序的效率,也就是说单个程序可以创建多个不同的线程来完成各自的任务。

缺点:

线程也是程序,线程也需要占内存,线程也多内存也占的也多。

多线程需要协调和管理,所以需要CPU跟踪线程。

线程之间共享资源的访问会相互影响,必须解决禁用共享资源的问题。

05、​​​​​​​问:什么是线程与进程呢?

答:

进程:内存中运行的运用程序,每个进程都有自己独立的内存空间,一个进程可以由多个线程,例如在Windows系统中,xxx.exe就是一个进程。

线程:进程中的一个控制单元,负责当前进程中的程序执行,一个进程至少有一个线程,一个进程可以运行多个线程,多个线程可以共享数据。

06、问:谈谈线程与进程的区别?

答:

根本区别

  • 进程是操作系统资源分配的基本单元,而线程是处理器任务调度的和执行的基本单位。

资源开销:

  • 每个进程都有自己独立的代码和空间(程序上下文),程序之间的切换会有较大的开销;线程可以看作轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。

包含关系:

  • 如果一个进程内有多个线程,则执行的过程不是一条线的,而是多条线(多个线程),共同完成;线程是进程的一部分,可以把线程看作是轻量级的进程。

内存分配:

  • 同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的。

07、问:谈谈你对用户线程与守护线程的认识与理解

答:

  • 用户(User)线程:运行在前台,执行具体任务,如程序的主线程,连接网络的子线程都是用户线程。
  • 守护(Daemon)线程:运行在后台,为其它前台线程服务,也可以说守护线程是JVM非守护线程的”佣人“,一旦所有线程都执行结束,守护线程会随着JVM一起结束运行。

main函数就是一个用户线程,main函数启动时,同时JVM还启动了好多的守护线程,如垃圾回收线程,比较明显的区别时,用户线程结束,JVM退出,不管这个时候有没有守护线程的运行,都不会影响JVM的退出。

08、​​​​​​​问:什么是线程死锁呢?

答:死锁是指两个或两个以上进程(线程)在执行过程中,由于竞争资源或由于彼此通信造成的一种堵塞的现象,若无外力的作用下,都将无法推进,此时的系统处于死锁状态。

09、​​​​​​​问:请问形成死锁的必要条件?

答:

互斥条件:

  • 线程(进程)对所分配的资源具有排它性,即一个资源只能被一个进程占用,直到该进程被释放。

请求与保持条件:

  • 一个进程(线程)因请求被占有资源而发生堵塞时,对已获取的资源保持不放。

不剥夺条件:

  • 线程(进程)已获取的资源在未使用完之前不能被其他线程强行剥夺,只有等自己使用完才释放资源。

循环等待条件:

  • 当发生死锁时,所等待的线程(进程)必定形成一个环路,死循环造成永久堵塞。

10、问:请问如何避免死锁呢?

答:我们只需破坏形参死锁的四个必要条件之一即可。

破坏互斥条件:

  • 无法破坏,我们的锁本身就是来个线程(进程)来产生互斥

破坏请求与保持条件:

  • 一次申请所有资源

破坏不剥夺条件:

  • 占有部分资源的线程尝试申请其它资源,如果申请不到,可以主动释放它占有的资源。

破坏循环等待条件:

  • 按序来申请资源。

11、​​​​​​​问:什么是上下文的切换?

答:当前任务执行完,CPU时间片切换到另一个任务之前会保存自己的状态,以便下次再切换会这个任务时可以继续执行下去,任务从保存到再加载执行就是一次上下文切换。

12、问:请谈谈创建线程的几种方式

答:

  1. 继承Thread类

  2. 实现Runnable接口

  3. 实现Callable接口

  4. Executors工具类创建线程池

13、​​​​​​​问:Runnable接口和Callable接口有什么区别呢?

答:

相同点:Runnable和Callable都是接口、都可以编写多线程程序、都采用Thread.start()启动线程

不同点:

  • Runnable接口run方法无返回值,Callable接口call方法有返回值,是个泛型,和Futrue和FutureTask配合用来获取异步执行结果。
  • Runable接口run方法只能抛出运行时的异常,且无法捕获处理;Callable接口call方法允许抛出异常,可以获取异常信息。

注:Callable接口支持返回执行结果,需要调用FutureTask.get()得到,此方法会堵塞主线程继续往下执行,如果不调用就不会堵塞。

14、​​​​​​​问:run()方法和start()方法有什么区别吗?

答:

  •     每个线程都是通过某个特定的Thread对象对于的run()方法来完成其操作的,run方法称为线程体,通过调用Thread类的start方法来启动一个线程。
  •     start()方法用于启动线程,run()方法用于执行线程的运行代码,run()可以反复调用,而start()方法只能被调用一次。
  •     start()方法来启动一个线程,真正实现了多线程的运行。调用start()方法无需等待run()方法体代码执行结束,可以直接继续执行其它的代码;调用start()方法线程进入就绪状态,随时等该CPU的调度,然后可以通过Thread调用run()方法来让其进入运行状态,run()方法运行结束,此线程终止,然后CPU再调度其它线程。

15、​​​​​​​问:为什么调用start()方法会执行run()方法,为什么不能直接调用run()方法呢?

答:new Thread,线程进入了新建的状态,start方法的作用是使线程进入就绪的状态,当分配到时间片后就可以运行了。start方法会执行线程前的相应准备工作,然后在执行run方法运行线程体,这才是真正的多线程工作。

如果直接执行了run方法,run方法会被当作一个main线程下的普通方法执行,并不会在某个线程中去执行它,所以这并不是多线程工作。

总结:调用start方法启动线程可使线程进入就绪状态,等待运行;run方法只是thread的一个普通方法调用,还是在主线程里执行。

16、​​​​​​​问:请谈谈什么是Callable和Future?

答:

  • Callable接口也类似于Runnable接口,但是Runnable不会接收返回值,并且无法抛出返回结果的异常,而Callable功能更强大,被线程执行后,可有返回值,这个返回值可以被Future拿到,也就是说Future可以拿到异步执行任务的返回值。
  • Future接口表示异步任务,是一个可能没有完成的异步任务结果,所以说Callable用于产生结果,Future用于接收结果。

17、问:请谈谈什么是FutureTask?

答:FutureTask是一个异步运算的任务,FutureTask里面可以可以传入Callable实现类作为参数,可以对异步运算任务的结果进行等待获取,判断是否已经完成,取消任务等操作。只有当结果完成之后才能取出,如果尚未完成get方法将堵塞。一个Future对象可以调用Callable和Runable的对象进行包装,由于FutureTask也是Runnable接口的实现类,所以FutureTask也可以放入线程池中。


Thanks~

..

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/100072.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java编程】MVC框架和经典三层结构

MVC框架和经典三层结构1.MVC框架 JSP,全称 Java Server Pages,中文名是 Java 服务器页面,其实是一种以 Java 为主的跨平台 Web 开发语言。JSP 文件由传统网页 HTML 文件插入 Java 程序段所形成,实现了 HTML 语法的 Java 扩张。在…

一篇文章了解 Apache Druid

前言 本文隶属于专栏《大数据技术体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见大数据技术体系 概述 Apache Druid 是一个实时分析型数据库&#xf…

图文结合带你搞懂MySQL日志之Error Log(错误日志)

GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。GreatSQL是MySQL的国产分支版本,使用上与MySQL一致。作者:KAiTO文章来源:社区原创 往期回顾: 图文结合带你搞懂MySQL日志之Redo Log(重做日志)…

[附源码]计算机毕业设计Python的云网盘设计(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等…

极智AI | 谈谈昇腾CANN量化

欢迎关注我的公众号 [极智视界],获取我的更多笔记分享 大家好,我是极智视界,本文介绍一下 谈谈昇腾CANN量化。 昇腾CANN的量化体现在AMCT工具,也即模型压缩工具,后面再来说AMCT,这篇先聊一下昇腾CANN的量…

SpringBoot学习小结之滑块验证码生成库tianai-captcha

文章目录前言一、后端springboot1.1 yml 配置1.2 跨域配置1.3 资源配置1.4 Controller二、前端jquery2.1 通用代码2.2 滑动验证码2.3 旋转验证码2.4 滑动还原验证码2.5 文字点选验证码三、源码探秘和总结3.1 前端代码3.2 后端代码3.3 总结参考前言 最近发现一个有趣的 Java 验…

Java根据ip地址获取归属地

最近,各大平台都新增了评论区显示发言者ip归属地的功能,例如哔哩哔哩,微博,知乎等等。 下面,我就来讲讲,Java 中是如何获取 IP 属地的,主要分为以下几步 通过 HttpServletRequest 对象&#xf…

JVM监控及诊断工具-GUI

1. 工具概述 使用上一章命令行工具或组合能帮您获取目标Java应用性能相关的基础信息,但它们存在下列局限: 1)无法获取方法级别的分析数据,如方法间的调用关系、各方法的调用次数和调用时间 等(这对定位应用性能瓶颈至关重要)。 2…

【MybatisPlus】最全面的MybatisPlus通关教程

前言 本文为最全面的MybatisPlus通关教程相关介绍,下边将对MyBatisPlus概述,MyBatisPlus快速入门,CRUD扩展(包括:插入操作、主键生成策略、更新操作,自动填充,乐观锁,查询操作&#…

我学python的那段日子(四)选择结构和循环结构

1.选择结构 总所周知,Java里面也有选择结构,分别是if单分支选择结构、if-else结构多重if结构和switch结构,同样的,Python里也有选择结构,分别是是if单分支选择结构、if-else结构多重if结构。 1.1 if选择结果 ​ if选…

Servlet生命周期和线程安全

✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏:JAVA开发者…

CANoe-是如何对ECU和网络进行测试的

CANoe工具是汽车仿真测试开发中使用最广泛的工具 Test Module/Test Unit 除了仿真模块和分析模块,CANoe还引入了另一个组件进行测试:Test Module(测试模块)和Test Unit(测试单元) test module调用的是capl脚本、.net脚本或xml文件,而test unit用的是vTESTstudio插件 实…

12.18

一.加强练习promise 1.fs模块 const fs require(fs) const p new Promise((resolve,reject) > {fs.readFile(./resource/context.txt, (err,data) > {if (err) reject(err)resolve(data)}) }) p.then((value) > {console.log(value.toString()) }, (reason) > …

前端炫酷特效合集

我们经常在抖音上看到一些前端很酷的特效,诸如:快叫你学编程的朋友给你写一个圣诞树,看着是不是很酷炫呢?其实只要有源码,你也可以拥有哦! 跟大家分享多款前端特效源码,需要的朋友可以去在这里…

Java : 多态,包装类的面试题:

Java : 多态,包装类的面试题: 每博一文案 有人说:小孩子才会仰天大哭,成年人的世界早就调成了静音模式,连崩溃也很懂事。 一路走来,我们一边受伤,也一边变得更坚强,慢慢…

数据库原理及MySQL应用 | 日志管理

数据库系统管理维护阶段需要通过日志对数据库的性能进行监督、分析和改进。 日志是数据库系统的重要组成部分,记录了数据库的运行状态、数据的变更历史、错误信息及用户操作等信息。在日常管理中,数据库管理员可通过日志监控数据库的运行状态、优化数据库…

国内外文献镜像网站

一、常用的国内外文献镜像网站 维普网:http://lib.cqvip.com/ idata:https://www.cn-ki.net/ 独秀:https://www.duxiu.com/ 中国知网:https://www.cnki.net/ 龙源期刊网:http://www.qikan.com.cn/ 万方数据&#xff1…

计算机毕业设计HTML+CSS+JavaScript仿大型购物商城(1页)

常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他等网页设计题目, A…

毕业设计 单片机GPS定位位置记录系统 - 物联网 嵌入式 stm32

文章目录0 前言1 简介2 主要器件3 实现效果4 硬件设计概述硬件模块的连接**AB32VG1主控MCU**5 软件说明6 部分核心代码7 最后0 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩…

基于asp.net人力资源管理系统-计算机毕业设计

基于asp.net的人力资源管理的内容和人事管理日常管理所遇到的问题,整个系统可以分为下面几个子模块,分别为员工档案信息管理、工资信息管理、考勤信息管理、消息信息管理、账号信息管理等几个大的功能模块,开发环境:Visual studio,sqlserver数据库.资料有…