JAVA面试题分享---多线程与线程池

news2025/1/11 19:50:12

多线程

什么是线程?线程和进程的区别?(了解)

线程:是进程的一个实体,是 cpu 调度和分派的基本单位,是比进程更小的 可以独立运行的基本单位。

进程:具有一定独立功能的程序关于某个数据集合上的一次运行活动,是操作 系统进行资源分配和调度的一个独立单位。

特点:线程的划分尺度小于进程,这使多线程程序拥有高并发性,进程在运行 时各自内存单元相互独立,线程之间 内存共享,这使多线程编程可以拥有更好 的性能和用户体验。

 创建线程有几种方式(必会)

1.继承 Thread 类并重写 run 方法创建线程,实现简单但不可以继承其他类

2.实现 Runnable 接口并重写 run 方法。避免了单继承局限性,编程更加灵活,实现解耦。

3.实现 Callable 接口并重写 call 方法,创建线程。可以获取线程执行结果的返回 值,并且可以抛出异常。

4.使用线程池创建(使用 java.util.concurrent.Executor接口)

Runnable 和 Callable 的区别?(必会)

主要区别 Runnable 接口 run 方法无返回值;Callable 接口 call 方法有返回值,支持泛型 Runnable 接口 run 方法只能抛出运行时异常,且无法捕获处理;Callable 接口 call 方 法允许抛出异常,可以获取异常信息

如何启动一个新线程、调用 start 和 run 方法的区别?(必会)

线程对象调用 run 方法不开启线程。仅是对象调用方法。

线程对象调用 start 开启线程,并让 jvm 调用 run 方法在开启的线程中执行

调用 start 方法可以启动线程,并且使得线程进入就绪状态,而 run 方法只是 thread 的一 个普通方法,还是在主线程中执行。

线程有哪几种状态以及各种状态之间的转换?(必会)

1. 第一是 new->新建状态。在生成线程对象,并没有调用该对象的 start 方法,这是线程处于 创建状态。

2. 第二是 Runnable->就绪状态。当调用了线程对象的 start 方法之后,该线程就进入了就绪 状态,但是此时线程调度程序还没有把该线程设置为当前线程,此时处于就绪状态。

3. 第三是 Running->运行状态。线程调度程序将处于就绪状态的线程设置为当前线程,此时线 程就进入了运行状态,开始运行 run 函数当中的代码。

4. 第四是阻塞状态。阻塞状态是线程因为某种原因放弃 CPU 使用权,暂时停止运行。直到线程 进入就绪状态,才有机会转到运行状态。阻塞的情况分三种: (1)等待 – 通过调用线程的 wait() 方法,让线程等待某工作的完成。 (2)超时等待 – 通过调用线程的 sleep() 或 join()或发出了 I/O 请求时,线程会进入到阻塞状态。 当 sleep()状态超时、join()等待线程终止或者超时、或者 I/O 处理完毕时,线程重新转入就绪状 态。 (3)同步阻塞 – 线程在获取 synchronized 同步锁失败(因为锁被其它线程所占用),它会进入同 步阻塞状态。

5. 第五是 dead->死亡状态: 线程执行完了或者因异常退出了 run()方法,该线程结束生命周期.

线程相关的基本方法?(必会)

线程相关的基本方法有 wait,notify,notifyAll,sleep,join,yield 等

1.线程等待(wait)

调用该方法的线程进入 WAITING 状态,只有等待另外线程的通知或被中 断才会返回,需要注意的是调用 wait()方法后,会释放对象的锁。因此,wait 方 法一般用在同步方法或同步代码块中。

2.线程睡眠(sleep)

sleep 导致当前线程休眠,与 wait 方法不同的是 sleep 不会释放当前占 有的锁,sleep(long)会导致线程进入 TIMED-WATING 状态,而 wait()方法 会导致当前线程进入 WATING 状态.

3.线程让步(yield)

yield 会使当前线程让出 CPU 执行时间片,与其他线程一起重新竞争 CPU 时间片。一般情况下,优先级高的线程有更大的可能性成功竞争得到 CPU 时间片,但这又不是绝对的,有的操作系统对 线程优先级并不敏感。

4.线程中断(interrupt)

中断一个线程,其本意是给这个线程一个通知信号,会影响这个线程内部的 一个中断标识位。这个线程本身并不会因此而改变状态(如阻塞,终止等)

5.Join 等待其他线程终止

 join() 方法,等待其他线程终止,在当前线程中调用一个线程的 join() 方 法,则当前线程转为阻塞状态,回到另一个线程结束,当前线程再由阻塞状态变 为就绪状态,等待 cpu 的宠幸.

6.线程唤醒(notify)

Object 类中的 notify() 方法,唤醒在此对象监视器上等待的单个线程,如 果所有线程都在此对象上等待,则会选择唤醒其中一个线程,选择是任意的,并 在对实现做出决定时发生,线程通过调用其中一个 wait() 方法,在对象的监视 器上等待,直到当前的线程放弃此对象上的锁定,才能继续执行被唤醒的线程, 被唤醒的线程将以常规方式与在该对象上主动同步的其他所有线程进行竞争。类 似的方法还有 notifyAll() ,唤醒再次监视器上等待的所有线程。

wait()和 sleep()的区别?(必会)

1. 来自不同的类

wait():来自 Object 类; sleep():来自 Thread 类;

2.关于锁的释放:

wait():在等待的过程中会释放锁; sleep():在等待的过程中不会释放锁

3.使用的范围:

wait():必须在同步代码块中使用; sleep():可以在任何地方使用;

4.是否需要捕获异常

wait():不需要捕获异常; sleep():需要捕获异常;

线程池

为什么需要线程池(了解)

在实际使用中,线程是很占用系统资源的,如果对线程管理不完善的话很容易导致 系统问题。因此,在大多数并发框架中都会使用线程池来管理线程,使用线程池管理线程主 要有如下好处:

1、使用线程池可以重复利用已有的线程继续执行任务,避免线程在创建销毁时造成的消耗

2、由于没有线程创建和销毁时的消耗,可以提高系统响应速度

3、通过线程可以对线程进行合理的管理,根据系统的承受能力调整可运行线程数量的大小等

线程池的分类(高薪常问)

1. newCachedThreadPool:创建一个可进行缓存重复利用的线程池

2. newFixedThreadPool:创建一个可重用固定线程数的线程池,以共享的无 界队列方式来运行这些线程,线程池中的线程处于一定的量,可以很好的控制线程的并发量

3. newSingleThreadExecutor : 创 建 一 个 使 用 单 个 worker 线 程 的 Executor ,以无界队列方式来运行该线程。线程池中最多执行一个线程,之后提交的线程 将会排在队列中以此执行

4. newSingleThreadScheduledExecutor:创建一个单线程执行程序,它可 安排在给定延迟后运行命令或者定期执行

5. newScheduledThreadPool:创建一个线程池,它可安排在给定延迟后运行 命令或者定期的执行

6. newWorkStealingPool:创建一个带并行级别的线程池,并行级别决定了 同一时刻最多有多少个线程在执行,如不传并行级别参数,将默认为当前系统的 CPU 个数

核心参数(高薪常问)

corePoolSize:核心线程池的大小

maximumPoolSize:线程池能创建线程的最大个数

keepAliveTime:空闲线程存活时间

unit:时间单位,为 keepAliveTime 指定时间单位

workQueue:阻塞队列,用于保存任务的阻塞队列

threadFactory:创建线程的工程类 handler:饱和策略(拒绝策略)

线程池的原理(高薪常问)

线程池的工作过程如下: 当一个任务提交至线程池之后, 1. 线程池首先判断核心线程池里的线程是否已经满了。如果不是,则创建一个新的工作线 程来执行任务。否则进入 2 ,2 判断工作队列是否已经满了,倘若还没有满,将线程放入工作队列。否则进入 3 判断线程池里的线程是否都在执行任务。如果不是,则创建一个新的工作线程来执行。 如果线程池满了,则交给饱和策略来处理任务。

拒绝策略(了解)

ThreadPoolExecutor.AbortPolicy(系统默认): 丢弃任务并抛出 RejectedExecutionException 异常,让你感知到任务被拒绝了,我们可以根据业务逻辑选 择重试或者放弃提交等策略 ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常,相对而 言存在一定的风险,因为我们提交的时候根本不知道这个任务会被丢弃,可能造成数据丢失。 ThreadPoolExecutor.DiscardOldestPolicy: 丢弃队列最前面的任务,然后重新尝试执 行任务(重复此过程),通常是存活时间最长的任务,它也存在一定的数据丢失风险 ThreadPoolExecutor.CallerRunsPolicy:既不抛弃任务也不抛出异常,而是将某些任务 回退到调用者,让调用者去执行它。

线程池的关闭(了解)

关闭线程池,可以通过 shutdown 和 shutdownNow 两个方法

原理:遍历线程池中的所有线程,然后依次中断

1、shutdownNow 首先将线程池的状态设置为 STOP,然后尝试停止所有的正在执行和未执 行任务的线程,并返回等待执行任务的列表;

2、shutdown 只是将线程池的状态设置为 SHUTDOWN 状态,然后中断所有没有正在执 行任务的线程

写在最后

线程相关知识点在面试过程中,十分容易被问到。在笔者的面试经历中,有关线程的问题被询问了四五次,对线程以及线程池的理解,线程池核心参数,线程执行过程等这些相关知识点需要记忆加理解,并且能够用自己的话表述出来。笔者小,中,大厂均有面试经历,每日分享全栈知识与JAVA面试题,希望与大家共同进步。

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

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

相关文章

edge 入门基础了解使用

随着Windows 11的发布,Microsoft Edge也迎来了新的更新和改进。作为一名长期使用Edge的用户,我不仅注意到了这些表面的变化,还深入研究了Edge在Windows 11上的新特性和潜在优势。 快捷方式 查找框 在Microsoft Edge浏览器中,按…

经典网络解读——EfficientnetV2

论文:EfficientNetV2: Smaller Models and Faster Training(2021.4) 作者:Mingxing Tan, Quoc V. Le 链接:https://arxiv.org/abs/2104.00298 代码:https://github.com/google/automl/tree/master/efficien…

Docker容器---docker-Consul部署

一、Docker-consul简介 1、概述 consul是google开源的一个使用go语言开发的服务管理软件。支持多数据中心、分布式高可用的、服务发现和配置共享。采用Raft算法,用来保证服务的高可用。内置了服务注册与发现框架、分布一致性协议实现、健康检查、Key/Value存储、多…

一、交换网络基础

目录 1.交换机的转发行为 2.数据帧的类型 3.ARP地址解析步骤 Hub:物理层设备 交换机:数据链路层设备 1.交换机的转发行为 泛洪(Flooding)(有可能是单播帧(未知单播帧),也有可能是…

一文解决ArcGIS生成点和管段 含案例讲解

背景 在工作中,我们经常遇到要将坐标数据导入 GIS,生成点位,若是地理坐标系(经纬度),那么直接用 arcgis或者QGIS 导入数据就行了,可实际中总会遇到各种问题: 坐标数据集为大地 200…

SQLite数据库添加密码

背景: 最近发现软件在运行过程中,数据库文件暴露在外面,而且直接拷贝后就能打开,发现这样来说数据并不是很安全我使用的开发环境是VS QT,使用navicat创建了一个数据库准备 百度搜索了一些资料和博客,发现…

kube-prometheus部署到 k8s 集群

文章目录 **修改镜像地址****访问配置****修改 Prometheus 的 service****修改 Grafana 的 service****修改 Alertmanager 的 service****安装****Prometheus验证****Alertmanager验证****Grafana验证****卸载****Grafana显示时间问题** 或者配置ingress添加ingress访问grafana…

《深入解析WIndows操作系统》第9章读书笔记

1、闪存类型:常见的闪存类型有NOR和NAND。NOR闪存在操作上最接近RAM,它的每个字节都可以被独立地寻址,而NAND闪存则被组织成以块为单位,就像磁盘一样。NOR类型的闪存用来设计保存计算机主板上的BIOS,而NAND类型的闪存被…

Go语言的包管理工具go mod与之前的GOPATH有什么区别?

在深入探讨Go语言的包管理工具go mod与之前的GOPATH之间的区别之前,我们首先需要理解这两个概念各自的作用和背景。 GOPATH时代 在Go语言早期版本中,GOPATH是一个非常重要的环境变量。它告诉Go工具链在哪里查找你的Go代码、第三方库以及编译后的二进制…

字节跳动(社招)四面算法原题

TikTok 进展 又是一期定时汇报 TikTok 进展的推文。 上周,美国总统拜登签署了价值 950 亿美元的一揽子对外援助法案。 该法案涉及强制字节跳动剥离旗下应用 TikTok 美国业务,即 针对 TikTok 非卖即禁的"强抢行为"开始进入九个月(27…

JWT是什么?如何使用?

JWT是什么?如何使用? 前言什么是JWT?概念工作方式JWT的组成HeaderPayloadSignatrue 实战引入依赖自定义注解定义实体类定义一个JWT工具类业务校验并生成token定义拦截器配置拦截器定义接口方法并添加注解开始验证 使用场景注意事项 JWT与传统…

【练习1】

1.字符串最后一个单词的长度 #include <iostream> #include<string> using namespace std;int main() {string a;int res,i,flag;flag1;i0;getline(cin,a);res0;while(flag1){if(a[i]! ){resres1;}else{res0;}if(ia.length()-1){flag-1;}i;}cout<<res<<…

服务器遭受攻击后的黑洞状态应对策略及防护机制解析

引言 在网络安全领域中&#xff0c;当服务器遭受大规模DDoS攻击或其他恶意流量冲击时&#xff0c;为了保护服务的稳定性和其他正常用户的使用体验&#xff0c;往往会采取一种紧急防护手段——将服务器置于黑洞状态。所谓黑洞状态&#xff0c;即网络服务商暂时屏蔽掉对服务器的…

与Apollo共创生态:让汽车更聪明,让出行更简单

目录 前言Apollo X 企业解决方案Studio X 企业协同开发工具链Apollo开放平台携手伙伴共创生态Apollo开发平台生态共创计划 前言 百度2013年开始布局自动驾驶&#xff0c;2017年推出全球首个自动驾驶开放平台Apollo。目前百度Apollo已经在自动驾驶、智能汽车、智能地图等领域拥有…

Agisoft Metashape 自定义底图

Agisoft Metashape 自定义底图 前言 Agisoft Metashape 从2.0.2 版本开始,Agisoft Metashape Professional 和 Agisoft Viewer 支持自定义底图,可用于模型和正射视图模式。本文以添加Esri World Image卫星底图图源为例,介绍Agisoft Metashape 自定义底图的方法。 添加自定…

STM32F103(Cubemx)驱动ST7789

源码来源&#xff1a; 中景园电子的标准库使用SPI驱动ST7789的TFT_LCD彩屏&#xff0c;将标准库修改为HAL库使用 Cubemx配置&#xff1a; 时钟配置 SPI配置&#xff1a; 引脚配置 源码修改 修改原有的SPI发送函数&#xff0c;并把原有的引脚初始化注释&#xff0c;不需要…

smac 路径优化器分析——距离成本和代价地图成本分析

参考 泰勒级数直观详解 前向差分&#xff0c;后向差分&#xff0c;中心差分 相关文章 smac 路径优化器分析——平滑度成本分析 smac 路径优化器分析——曲率成本分析 距离成本 距离成本函数 用优化后的点与原路径点的欧氏距离的平方作为成本。 下图中蓝色原点是原路径点…

73、栈-柱状图中最大的矩形

思路&#xff1a; 矩形面积&#xff1a;宽度*高度 高度如何确定呢&#xff1f;就是在宽度中最矮的元素。如何确定宽度&#xff0c;就是要确定左右边界。 当我们在处理直方图最大矩形面积问题时&#xff0c;遇到一个比栈顶柱子矮的新柱子时开始计算面积的原因关键在于如何确定…

大数据组件之Storm详解

Storm 是一个免费并开源的分布式实时计算系统&#xff0c;具有高容错性和可扩展性。它能够处理无边界的数据流&#xff0c;并提供了实时计算的功能。与传统的批处理系统相比&#xff0c;Apache Storm 更适合处理实时数据。 让我们深入了解一下 Storm&#xff1a; 1.Storm 简介…

【自研网关系列】过滤器链 -- 灰度发布过滤器

&#x1f308;Yu-Gateway&#xff1a;&#xff1a;基于 Netty 构建的自研 API 网关&#xff0c;采用 Java 原生实现&#xff0c;整合 Nacos 作为注册配置中心。其设计目标是为微服务架构提供高性能、可扩展的统一入口和基础设施&#xff0c;承载请求路由、安全控制、流量治理等…