Java基础面试题突击系列4

news2025/1/12 13:42:53

👩🏻 作者:一只IT攻城狮 ,关注我不迷路
❤️《java面试核心知识》突击系列,持续更新…
💐 面试必知必会学习路线:Java技术栈面试系列+SpringCloud项目实战学习路线
📝再小的收获x365天都会成就不一样的自己,一起学习,一起进步。

文章目录

  • 一、守护线程(服务线程)
  • 二、红黑树有哪几个特征?
  • 三、线程的 run() 和 start() 有什么区别和关系?
  • 四、多线程的上下文切换
    • 1、上下文
    • 2、上下文切换的内容
  • 五、get方式和post方式有何区别
  • 六、Java中用到的线程调度算法
    • 1、调度
    • 2、算法
  • 七、创建线程有哪几种方式?
  • 八、线程有哪些状态?
  • 九、线程池都有哪些状态?
  • 十、线程池实现原理
  • 十一、线程池4种拒绝策略
  • 十二、Java中CycliBarriar和CountdownLatch的区别
  • 十三、怎么检测一个线程是否拥有锁
  • 十四、不可变对象
  • 十五、线程池中 submit() 和 execute() 方法有什么区别?


一、守护线程(服务线程)

守护线程是后台线程,为用户线程提供公共服务。任何线程都可以设置为守护线程和用户线程,通过方法Thread.setDaemon(bool on);true则把该线程设置为守护线程,反之则为用户线程。Thread.setDaemon()必须在Thread.start()之前调用,否则运行时会抛出异常。

守护线程优先级较低是jvm级别的,垃圾回收就是一个经典的守护线程,当垃圾回收线程是jvm仅剩的线程时,会自动离开,jvm就可以退出了,守护线程不依赖终端,与系统“同生共死”。Finalizer也是守护线程。

二、红黑树有哪几个特征?

1、每个节点是 黑色或红色
2、根节点是黑色
3、每个叶子节点都是黑色(指向空的叶子节点)
4、如果一个叶子节点是红色,那么其子节点必须都是黑色的
5、从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点

三、线程的 run() 和 start() 有什么区别和关系?

调用start方法方可启动线程,源码分析里面调用了start0,是一个native方法,start() 只能调用一次;非java实现的,这个方法里面实现了多线程并对run方法进行了调用。

而run方法用于执行线程的运行时代码,只是thread类中的一个普通方法调用,还是在主线程里执行,run() 可以重复调用。所以直接调用run,就像普通实例对象调用自己的普通方法一样,只会顺序执行!
在start这个方法的设计上,其实java源码采用了“模版模式”这种设计模式。所以一定要调用start启动线程。

四、多线程的上下文切换

1、上下文

上下文:是指某一时间点,cpu寄存器(cpu内部数量较小但是速度很快的内存)和程序计数器(表明cpu执行的位置)内容;上下文切换是内核(操作系统核心)在cpu上对进程(线程)的切换,切换过程中的信息是保存在进行控制块PCB中的,PCB还被称作“切换帧”,信息一致保存在cpu内存中,知道被再次使用。

多线程的上下文切换即任务状态的保存再加载(因为cpu时间片轮转,所以就会切换)

2、上下文切换的内容

上下文切换的内容:挂起一个进程,将这个进程在cpu中状态(上下文)存储于内存中某处;
在内存中检索下一个进程的上下文,并将其在cpu寄存器恢复;
跳到程序计数器指向的位置,恢复该进程;

五、get方式和post方式有何区别

GET方式:在URL地址后附带的参数是有限制的,其数据容量通常不能超过1K。请求参数放在URL地址后面,以?的方式来进行拼接;GET方式一般用来获取数据。

POST方式:可以在请求的实体内容中向服务器发送数据,传送的数据量无限制。请求参数放在HTTP请求包中;POST方式一般用来提交数据。

六、Java中用到的线程调度算法

1、调度

抢占式调度:线程切换由系统控制(一个线程阻塞不会导致整个进程阻塞);
协助式调度(接力):由线程本身控制(一个线程阻塞,整个系统奔溃);
jvm中线程调度是抢占式调度;

java中线程调度是时间片轮转的方式;可以设置线程的优先级,按照优先级分配时间片,但是尽量不要用,防止线程饥饿。

2、算法

1)优先调度算法:
先来先服务调度算法;
短作业优先调度算法;

2)高优先权优先调度算法:
非抢占式优先权调度算法;
抢占式优先权调度算法;
高响应比优先调度算法;

小结:每一个线程都是有优先级的,一般来说,高优先级的线程在运行时会具有优先权,但这依赖于线程调度的实现,这个实现是和操作系统相关的(OS dependent)。我们可以定义线程的优先级,但是这并不能保证高优先级的线程会在低优先级的线程前执行。线程优先级是一个int变量(从1-10),1代表最低优先级,10代表最高优先级。

七、创建线程有哪几种方式?

1、继承 Thread 重写 run 方法;
2、实现 Runnable 接口;
3、实现 Callable 接口;
4、通过线程池创建。

更详细介绍:java中如何创建一个线程?

八、线程有哪些状态?

1、New(初始化状态)
用new语句创建的线程处于新建状态,此时它和其他Java对象一样,仅仅在堆区中被分配了内存。如:Thread t = new MyThread();

2、Runnable(就绪状态)
当调用线程对象的start()方法,线程即进入就绪状态。处于就绪状态的线程,只是说明此线程已经做好了准备,Java虚拟机会为它创建方法调用栈和程序计数器。处于这个状态的线程位于可运行池中,等待获得CPU的使用权,并不是说执行了start()此线程立即就会执行。

3、Running(运行状态)
当就绪状态中的线程获得了CUP执行资源,执行run()中的代码,这样的线程我们称为运行状态的线程。

4、Blocked(阻塞状态)
处于运行中的线程,由于某种原因放弃对cpu的使用权,处于阻塞状态,直到其进入就绪状态,才有机会再次被cpu调用进入运行状态。

5、Terminated(终止状态)

更详细介绍:线程生命周期及五种状态

九、线程池都有哪些状态?

线程池生命周期的五种状态:
1、RUNNING:这是最正常的状态,接受新的任务,处理等待队列中的任务。

2、SHUTDOWN:不接受新的任务提交,但是会继续处理等待队列中的任务。

3、STOP:不接受新的任务提交,不再处理等待队列中的任务,中断正在执行任务的线程。

4、TIDYING:所有的任务都销毁了,workCount 为 0,线程池的状态在转换为 TIDYING 状态时,会执行钩子方法 terminated()。

5、TERMINATED:terminated()方法结束后,线程池的状态就会变成这个。

更详细介绍:Java多线程之Executor框架

十、线程池实现原理

1、如果运行线程数小于corePoolSize,那么马上创建线程运行这个任务;

2、如果正在运行的线程数大于等于corePoolSize,那么将这个任务放进队列;

3、如果队列放满了,如果正在运行的线程数小于maximumPoolSize,创建线程处理任务;

4、如果队列放满了,正在运行的线程数大于等于maximumPoolSize,那么线程会抛出异常;RejectExecutionException,执行拒绝策略。

十一、线程池4种拒绝策略

1、AbortPolicy :直接抛出异常,阻止系统运行(线程池默认的拒绝策略);

2、CallerRunsPolicy:由调用线程处理;

3、DiscardPolicy:丢弃无法处理的任务,不予任何处理;

4、DiscardOldestPolicy:丢弃最老的一个请求,也就是即将被执行的一个任务,重新提交被拒绝的任务。

十二、Java中CycliBarriar和CountdownLatch的区别

CountDownLatch和CyclicBarrier都能够实现线程之间的等待,只不过它们侧重点不同:

CountDownLatch一般用于某个线程A等待若干个其他线程执行完任务之后,它才执行;
而CyclicBarrier一般用于一组线程互相等待至某个状态,然后这一组线程再同时执行;
另外,CountDownLatch是不能够重用的,而CyclicBarrier是可以重用的。

十三、怎么检测一个线程是否拥有锁

在java.lang.Thread中有一个方法叫holdsLock(),它返回true如果当且仅当当前线程拥有某个具体对象的锁。

十四、不可变对象

Java平台类库中包含许多不可变类,如String、基本类型的包装类、BigInteger和BigDecimal等。它们的常量(域)是在构造函数中创建的。既然它们的状态无法修改,这些常量永远不会变。

不可变对象永远是线程安全的。
只有满足如下状态,一个对象才是不可变的;
它的状态不能在创建后再被修改;
所有域都是final类型;并且它被正确创建(创建期间没有发生this引用的逸出)。

十五、线程池中 submit() 和 execute() 方法有什么区别?

execute():只能执行 Runnable 类型的任务。
submit():可以执行 Runnable 和 Callable 类型的任务。
在这里插入图片描述

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

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

相关文章

Docker Compose 和 ChatGpt 私有部署

1. 下载 Docker Compose 的二进制文件: Docker Compose 的Github下载链接地址是: Releases docker/compose GitHub 注:这里没有讲解docker的安装,因为已经写好了,在这里可以去看一下,先安装好docker在其弄…

京东购物车如何提升30%性能 | 京东云技术团队

1、背景 购物车面临的挑战: 1)新业务:随着业务形态的丰富,购物车在不断支持各种新业务,依赖的外部接口也随之增加; 2)下沉:一些前端调用的接口下沉到购物车中台; 3&am…

Linux systemd

这里写目录标题 一:配置文件内容二:配置文件位置三:开机启动配置四:systemctl使用 一:配置文件内容 systemd服务配置文件存放在/usr/lib/systemd目录下,有系统system和用户user之分,需要开机不登录就能运行的程序,放在/usr/lib/systemd/syst…

项目跟踪的好处有哪些?项目经理必须了解

项目跟踪要跟踪什么呢?主要针对计划、任务和项目成员三个方面,是为了了解项目的实际进展情况而进行。 在跟踪过程中我们会发现项目计划的不当之处,促使我们去改进和完善计划;发现项目风险,及时解决问题;了…

软件设计之UML用例图大白话教程

1、为什么要使用UML用例图? 对一个复杂问题或者现象的分析,好的方式方法往往能带来事半功倍的效果。比如在软件开发领域,参与的人员角色各种各样,比如软件开发工程师、产品经理、客户、运营人员、老板、用户、B端客户等等&#x…

chatgpt赋能Python-python_kargs

Python中的*kargs:详解 在Python编程中,经常需要为函数传递参数。除了常规的参数传递,Python还支持通过关键字参数传递参数。这种方法比较灵活,可以快速地修改函数的输入参数。其中,kargs是Python中非常常见的一个参数…

管理git项目:003

首先我们得创建一个git管理仓库 进入桌面路径,待会创建的文件可以在桌面找到 cd ..【创建git管理仓库】:创建一个.git 管理仓库, 这个文件被创建后是一个隐藏文件。这个.git文件的作用是:指定当前文件夹作为git管理仓库 git init …

今天,我问了ChatGPT一个难以启齿的问题,内容实录

文 / 高扬(微信公众号:量子论) 七个月前,我是一个害怕失业的漂泊上海的小青年,每天在合租房里刷着LeetCode。 现在我已经在一家人工智能公司从事着自己喜欢的关于机器深度学习的研发工作。 你想知道我的生活发生了什么…

学习git

文章目录 02-为什么要学习Git软件?03 概念:版本控制04 概念:版本控制软件基础功能05 概念:集中式、分布式版本控制系统、多人协作开发5.1 文件冲突问题5.2集中式版本控制(CVS,SVN)5.3 分布式版本…

Word控件Aspose.Words教程:使用 Aspose.在 Java 中对条码使用 ECI 编码

Aspose.Words是一种高级Word文档处理API,用于执行各种文档管理和操作任务。API支持生成,修改,转换,呈现和打印文档,而无需在跨平台应用程序中直接使用Microsoft Word。 Aspose API支持流行文件格式处理,并…

LabVIEWCompactRIO 开发指南30 目标间通信

LabVIEWCompactRIO 开发指南30 目标间通信 可以从两种方法选择在FPGA VI和实时处理机上运行的VI之间传输数据的方法:前面板控制和指示器或DMAFIFO。可以使用前面板控件和指示器来传输最新值或标签以及DMA FIFO,以流式传输数据或发送消息和命令。这两种…

数据存储应用与原理剖析

存储引擎 存储引擎就是存放和读取用户数据的地方,对于持久化的存储引擎而言,数据的归宿是非易失性的存储介质(通俗意义上来说就是磁盘)所以该以什么形式组织和存储数据,这就是存储引擎设计的艺术所在这一块涉及到和操…

【历史上的今天】5 月 23 日:Java 正式发布;晶体管的共同发明者出生

整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来。 今天是 2023 年 5 月 23 日,在 2007 年的今天,盛大宣布出售所持有新浪公司股票,累计获利 7650 万美元。盛大曾于 2005 年 2 月通过公开市场…

Golang-循环变量作用域针对那些数据类型会出现问题

一、原因 在 Go 中,循环变量的作用域是整个 for 循环语句块。因此,循环变量在 for 循环语句块中的代码都是可见的。 但是,当循环变量的值被用于闭包, 协程或者使用指针类型的数据结构时,会出现一些问题。这是因为循环变量的值在…

每日一练 | 网络工程师软考真题 Day8

1、某客户端采用ping命令检测网络连接故障时,发现可以ping通127.0.0.1及本机的IP地址,但无法ping通同一网段内其他工作正常的计算机的IP地址。该客户端的故障可能是 。 A.TCP/IP协议不能正常工作 B.本机网卡不能正常工作 …

80%的人加班都是因为没搞清业务需求:小白如何做好需求调研?

做过项目的都知道,收集和明确需求并非易事,尤其是挖掘需求方详细、深层次的需求。 很多企业在做需求调研时,经常由于双方对问题描述和理解上的差异,使得需求在不断传递的过程中发生较大的偏差,结果导致最终开发出来的…

Head-Free Lightweight Semantic Segmentation with Linear Transformer 新颖的分割网络

现有的语义分割网络基本都是编码解码结构,新的语义分割网络主要都是在解码阶段添加新的不同模块,提高解码阶段特征处理能力,从而实现语义分割。而这篇文章主要是去除了解码阶段,把工作重心放在了编码阶段。它采用并行架构来利用原…

chatgpt赋能Python-python_isdigit_小数

Python isdigit 小数:如何检测字符串是否为数字? 在Python中,字符串是一种非常常见的数据类型。有时我们需要将字符串转换成数字类型,以便于进行各种计算,比如统计数据、计算平均数等等。在这种情况下,我们…

四、Spring从入门到改行

一、Spring概述 Spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器&#xff08;框架&#xff09;。 二、Spring基础程序 1、pom.xml中导入依赖 <dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifact…

chatgpt赋能Python-python_ip地址处理

Python IP地址处理 在网络通信中&#xff0c;IP地址是非常重要的内容。Python作为一门强大的编程语言&#xff0c;自然也能处理IP地址。本文将介绍Python处理IP地址的方法&#xff0c;并提供一些实用的例子。 IP地址的表示方式 IP地址是一个32位的二进制数&#xff0c;通常表…