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

【Java】Java开发工程师面试题目

Java开发工程师面试题目

  • 01. 并行和并发有什么区别?
  • 02. 进程与线程的区别?
  • 03. 守护线程是什么?
  • 04. 创建线程有哪几种方式?
  • 05. runnable和callable的区别是什么?
  • 06. 简述JDK、JRE、JVM之间的关系
  • 07. 描述一下类加载机制的含义和过程
  • 08. 说说你对Run-time Data Areas的理解
  • 09.分布式系统的设计目标:
  • 10.分布式事务有哪些解决方案?

01. 并行和并发有什么区别?

从软件的角度来说,并发就是在一段时间内以交替的方式去完成多个任务,而并行就是以齐头并进的方式去完成多个任务。
从硬件的角度来说,在一个处理器一次只能够运行一个线程的情况下,并发可以有一个处理器通过使用时间片分配的方式实现,而并行则需要靠多个处理器在同一时刻各自运行一个线程来实现。

多线程的实质就是实现并发化

02. 进程与线程的区别?

  • 性质不同:
    • 进程(Process)是程序向操作系统申请资源(如内存空间和文件句柄)的基本单位,是操作系统结构的基础。
    • 线程(thread)是进程中可独立执行的最小单位。它被包含在进程之中,是进程中的实际运作单位。
  • 适用范围不同:
    • 一个进程可以包含多个线程。使用进程目的在于清晰地刻画动态系统的内在规律,有效管理和调度进入计算机系统主存储器运行的程序。
    • 同一个进程中的所有线程共享该进程的资源,如内存空间、文件句柄等。有内核线程、用户线程等

03. 守护线程是什么?

守护线程是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。在Java中垃圾回收线程就是特殊的守护线程。

04. 创建线程有哪几种方式?

Java标准库类java.lang.Thread就是Java平台对线程的实现 。Thread类或其子类的一个实例就是一个线程。
多线程的实现方式有两类:

  • 常见的2种:
    • 继承Thread类: Thread类实际上是Runnable接口的一个实现类
    • 实现Runnable接口:Runnable接口可以被看作对任务进行的抽象,任务的处理逻辑就体现在run方法之中。
  • 不常见的2种:
  • Callable接口、Future Task创建线程
  • 通过线程池创建线程。优先使用ThreadPoolExecutor,不建议使用Executor

备注:Thread类的两个常用构造器是:Thread()和Thread(Runnable target)。相应地,Java语言种创建线程的有两种常用方式。一种是使用第一个构造器:定义Thread类的子类,在该子类种覆盖(Override)run方法并在该方法种实现线程任务处理逻辑;另一种是使用第二个构造器:创建一个java.lang.Runnable接口的实例,并在该实例的run方法种实现任务处理逻辑,然后以该Runnable接口实例作为构造器的参数直接创建(new)一个Thread类的实例。

但是不管是采用哪种方式创建线程,一旦线程的run方法被执行(由Java虚拟机调用)结束,相应的线程的运行也就结束了。其中run方法执行结束包括正常结束(run方法返回)以及代码中抛出异常而导致的中止。

线程属于“一次性用品”,start方法也只能被调用一次,多次调用同一个Thread实例的start方法会导致抛出IllegalThreadStateException异常。

在Java平台中,一个线程就是一个对象,Java虚拟机会为每个线程分配调用栈(Call Stack)所需的内存空间。调用栈用于跟踪Java代码(方法)间的调用关系以及Java代码对本地代码(Native Code,通常是C代码)的调用。另外Java平台中每个线程可能还有一个内核线程与之对应。

Java平台中的任意一段代码总是由确定的线程负责执行的,这个线程就相应地被称为这段代码的执行线程。同一段代码可以被多个线程执行。

如果没有启动线程而是在应用代码中直接调用线程的run方法的话,那么这个线程的run方法其实运行在当前线程(即run方法的调用方代码的执行线程)之中而不是运行在其自身线程中,从而违背了创建线程的初衷。

Thread类所实现的

05. runnable和callable的区别是什么?

首先,它们都是接口。其次,Runnable接口中的run()方法的返回值是void,它做的事情只是纯粹地去执行run()方法中的代码而已;然而,Callable接口中的call()方法是有返回值的,是一个泛型,和Future、FutureTask配合可以用来获取异步执行的结果。

06. 简述JDK、JRE、JVM之间的关系

答:JDK是一套编写Java应用程序的工具包,也就是一个Java程序开发环境。包括Java的运行环境,也就是JRE。Java虚拟机,即JVM运行在JRE中,属于Java应用程序运行的载体。

07. 描述一下类加载机制的含义和过程

答:这里完整的描述应该是Java虚拟机把描述类的数据从class文件加载到内存的过程,这里边包含多个步骤,包括:类文件的加载,数据的校验、变量的解析以及初始化,并最终将符号引用转换为直接引用,最终使用。这些过程都是在Java运行期间进行的。其中“通过一个类的全限定名来获取此类的二进制字节流”的代码称为“类加载器”,类加载器依据双亲委派原则进行类的加载。

08. 说说你对Run-time Data Areas的理解

答:从官网来看,Java运行时数据区包括pc寄存器、Java虚拟机栈、堆、方法区、运行时常量池以及本地方法栈。其中pc寄存器用来存储线程执行的字节码的行号,Java虚拟机栈用来维护局部变量和结果的调用和方法返回,堆是存储所有对象及其实例变量的内存区域,而方法区存储的是类的元数据信息,包括元数据、常量池、静态变量、字段以及方法,运行时常量池,即constant_pool相当于符号表,用于解析变量方法和字段;本地方法栈用来为虚拟机使用到的Native方法服务。这里重点是Java虚拟机栈、Heap和方法区

09.分布式系统的设计目标:

  • 可扩展性:通过对服务、存储的扩展来提高系统的处理能力,通过对多台服务器的协同工作,来完成单台服务器无法处理的任务,尤其是高并发或者大数据量的任务。
  • 高可用,单点不影响整体,单点故障指系统中某个组件一旦失效,会让整个系统无法工作
  • 无状态:无状态的服务才能满足部分机器宕机不影响全部,可以随时进行扩展的需求。
  • 可管理:便于运维、出问题能不能及时发现定位
  • 高可靠:同样的请求返回同样的数据,更新能够持久化,数据不会丢失

10.分布式事务有哪些解决方案?

  • 基于XA协议:两阶段提交和三阶段提交,需要数据库层面支持
  • 基于事务补偿机制的:TCC,基于业务层面实现
  • 本地消息表:基于本地数据库+mq,维护本地状态(进行中),通过mq调用服务,完成后响应一条消息回调,将状态改成完成。需要配合定时任务扫描、重新发送消息调用服务,需要保证幂等性
  • 基于事务消息:mq

相关文章:

  • 长春网站建设多少钱/百度广告联盟官网
  • 网站第三方统计工具/网站seo视频
  • 哪家公司建设网站/百度推广登陆
  • 做男装比较好的网站有哪些/电脑版百度网盘
  • 网站做百度推广吗/北京网络推广外包公司排行
  • 网站开发者账号购买/百度seo培训班
  • 【自用】VUE项目 宝塔部署 上线阿里云服务器CentOS7.6
  • 计算机网络期末重点考点总复习
  • 基于Servlet 的Java Web项目的CSRF防御概念
  • SpringBoot+Vue项目实践课程教学管理平台
  • 基于标志点特征高精提取与匹配方法,进行双目、结构光、RGBD相机、单目相机多视拼接
  • Cartesian product
  • 如何实现高性能点赞
  • Beego框架项目搭建步骤
  • 机器学习100天(十八):018 逻辑回归Python实战
  • 【数据驱动测试】从方法探研到最佳实践
  • 华为机试_HJ27 查找兄弟单词【中等】
  • 智牛股_第7章_OAuth2+Spring Security OAuth2+GateWay+Druid+Spring Data JPA