大厂HR经常会问到的Java线程池面试题

news/2024/5/20 18:30:09

一、什么是线程池

        线程池和数据库连接池非常类似,可以统一管理和维护线程,减少没有必要的开销。

二、为什么要使用线程池

        因为在项目开发过程中频繁的开启线程或者停止线程,线程需要重新被CPU从就绪状态调度到运行状态,需要发生CPU的上下文切换,效率非常低。

        线程的生命周期如下图所示:

java线程池面试题

三、线程池有哪些作用

        降低资源消耗:通过池化技术重复利用已创建好的线程,降低线程创建和销毁造成的损耗。

        提高响应速度:任务到达时,无需等待线程创建即可立即执行。

        提高线程的可管理性:线程是稀缺资源,如果无限制创建,不仅会消耗系统资源,还会因为线程的不合理分布导致资源调度失衡,降低系统的稳定性。使用线程池可以进行统一的分配、调优和监控。

        提供更多强大的功能:线程池具备可拓展性,允许开发人员向其中增加更多的功能。比如延迟定时线程池 ScheduledThreadPoolExecutor ,就允许任务延期执行或定期执行。

四、线程池的创建方式

        分为以下几种创建方式:

                Executors.newCachedThreadPool():可缓存线程池

                Executors.newFixedThreadPool():可定长度,限制最大线程数

                Executors.newScheduledThreadPool():可定时线程池

                Executors.newSingleThreadExecutor():单例线程池

底层都是基于 ThreadPoolExecutor 构造函数封装

五、如何实现复用

        本质思想:创建一个线程,不会立马体质或者销毁,而是一直实现复用。

        提前创建固定大小的线程一直保持正在运行的状态(可能会非常消耗CPU资源)。

        当需要线程执行任务,将该任务提交缓存在并发队列中,如果缓存队列满了,则会执行拒绝策略。

        正在运行的线程从并发队列中获取任务执行从而实现线程复用的问题。

线程池底层原理如下图所示:

java线程池面试题

线程池核心点:复用机制

        提前创建好固定的线程一直在运行状态---死循环实现。

        提交的线程任务缓存到一个并发队列集合中,交给我们正在运行的线程执行。

        正在运行的线程就从队列中获取该任务执行。

简单实现代码如下:

/*** @author zfl_a* @date 2021/3/20* @project multi-thread*/
public class CustExcutors {// 存放线程任务public BlockingDeque<Runnable> runnableList ;// 停止线程标识位private volatile Boolean isRun = true ;/*** 初始化* @param dequeSize 队列容器大小* @param threadCount 线程池大小*/public CustExcutors(int dequeSize,int threadCount){runnableList = new LinkedBlockingDeque<>(dequeSize);for (int i=0;i<threadCount;i++) {WorkThread workThread = new WorkThread();workThread.start();}}public void execute(Runnable runnable){runnableList.offer(runnable);}class WorkThread extends Thread {@Overridepublic void run (){// 标识位位true 或者队列中有未执行完成的任务while(isRun || runnableList.size()>0) {Runnable runnable = runnableList.poll();// 如果不为空 ,执行if(runnable!=null) {runnable.run();}}}}public static void main(String[] args) {CustExcutors custExcutors = new CustExcutors(10,2);for (int x=0;x<10;x++) {final int i = x ;custExcutors.execute(new Runnable() {@Overridepublic void run() {System.out.println(Thread.currentThread().getName()+"----"+i);}});}// 停止线程custExcutors.isRun=false;}
}

运行结果:只有两个线程在运行任务

java线程池面试题

六、ThreadPoolExecutor核心参数

corePoolSize:核心线程数量,一直正在保持运行的线程。

maximumPoolSize:最大线程数,线程池允许创建的最大线程数。

keepAliveTime:超出 corePoolSize 后创建的线程存活时间(当超过核心线程数后,又没有线程任务执行,达到该存活时间后,停止该线程)。

unit:keepAliveTime 的时间单位。

workQueue:任务队列,用于保持待执行的任务。

threadFactory :线程池内部创建线程所用的工厂。

handler:任务无法执行时的处理器(当任务被拒绝时)。

七、其他相关总结

线程池不会一直在运行状态。假设配置核心线程数 corePoolSize 为2 ,最大线程数 maximumPoolSize 为5,我们可以通过 corePoolSize 核心线程数后创建的线程的存活时间例如为60s,在60s内没有线程任务执行,则会停止该线程。

线程池底层 ThreadPoolExecutor 底层实现原理

2.1. 当线程数小于核心线程数时,创建线程。

2.2. 当线程数大于等于核心线程数,且任务队列未满时,将任务放入任务队列。

2.3. 当线程数大于等于核心线程数,且任务队列已满,有以下两种情况。

2.3.1. 如果线程数小于最大线程数,创建线程。

2.3.2. 如果线程数等于最大线程数,抛出异常,拒绝任务。

如果队列满了,且任务总数>最大线程数则当前线程走拒绝策略。可自定义拒绝异常,将该任务缓存到Redis、本地文件、mysql中,后期项目启动实现补偿。

拒绝策略有以下几种:

4.1. AbortPolicy:丢弃任务,抛出运行时异常。

4.2. CallerRunsPolicy:执行任务。

4.3. DiscardPolicy 忽视

4.4. DiscardOldestPolicy:从队列中剔除最先进入队列(最后一个执行)的任务。

4.5. 实现 RejectedExecutionHandler 接口,可自定义处理器。

如何合理配置参数

自定义线程池就需要我们自己配置最大线程数 maximumPoolSize ,为了高效的并发运行,这时需要看我们的业务是IO密集型还是CPU密集型。

5.1 CPU密集型:

CPU密集的意思是该任务需要最大的运算,而没有阻塞,CPU一直全速运行。CPU密集任务只有在真正的多核CPU上才能得到加速(通过多线程)。而在单核CPU上,无论你开几个模拟的多线程该任务都不可能得到加速,因为CPU总的运算能力就那么多。

5.2 IO密集型

IO密集型,即该任务需要大量的IO,即大量的阻塞。在单线程上运行IO密集型的任务会导致大量的CPU运算能力浪费在等待。所以在IO密集型任务中使用多线程可以大大的加速程序运行,即使在单核CPU上这种加速主要就是利用了被浪费掉的阻塞时间。

IO 密集型时,大部分线程都阻塞,故需要多配制线程数。公式为:

CPU核数*2
CPU核数/(1-阻塞系数) 阻塞系数在0.8~0.9之间
查看CPU核数:
System.out.println(Runtime.getRuntime().availableProcessors());

        以上就是“大厂HR经常会问到的Java线程池面试题”,你能回答上来吗?如果想要了解更多的Java面试题相关内容,可以加扣扣群390144688下载更多面试题。

另外分享薅羊毛地址,最近这家在送书,抽到还包邮,快来一起薅→团练送书


http://www.mrgr.cn/p/23185816

相关文章

爆肝整理,接口自动化测试-数据驱动框架封装(实战)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 接口自动化框架—…

SpringBoot环境标识设置及nacos匹配配置

本地环境标识设置 本地父类maven配置 可以看到相关的分类&#xff0c;设置环境标识主要需要用到profiles; <profiles><profile><id>dev</id><properties><!-- 环境标识&#xff0c;需要与配置文件的名称相对应 --><profiles.active&…

2023项目管理产品排行榜:优化企业项目管理的顶级选择

随着全球竞争加剧和商业环境的变化&#xff0c;企业对项目管理的需求越来越迫切。优秀的项目管理产品能够帮助企业提高工作效率、资源利用率和项目交付质量。 本文参考了不同的产品测评网站&#xff0c;在众多项目管理产品中&#xff0c;总结了以下几款备受好评的项目管理工具&…

stm32 mpu6050 cubemx DMP法读取角度

文章目录 前言一、相关文件二、cubemx配置三、代码变量初始化主循环 总结 前言 文件 记录使用dmp库来读取mpu6050的角度。 这是参考文件 参考1–主要参考 github参考 参考2 参考三 一、相关文件 相关文件在这里下载&#xff08;未填&#xff0c;不过可以在上面的git中下载&a…

js全端支持的深拷贝structuredClone

Jul 7, 2023 经过一年半的试用&#xff0c;structuredClone转正了&#xff0c;全端可以正式使用。 https://developer.mozilla.org/en-US/docs/Web/API/structuredClone

牛客网Verilog刷题——VL48

牛客网Verilog刷题——VL48 题目答案 题目 在data_en为高期间&#xff0c;data_in将保持不变&#xff0c;data_en为高至少保持3个B时钟周期。表明&#xff0c;当data_en为高时&#xff0c;可将数据进行同步。本题中data_in端数据变化频率很低&#xff0c;相邻两个数据间的变化&…

【Git】git reset 版本回退 git rm

前言 在日常开发时&#xff0c;我们经常会需要撤销之前的一些修改内容或者回退到之前的某一个版本&#xff0c;这时候reset命令就派上用场了 git reset 用法1——所有文件回退到某个版本 1、使用git reflog查看要回退的commit对象 2、使用git reset [-- hard/soft /mixed] …

计算机网络网--应用层

目录 应用层概述1.进程通信2. 供应用程序使用的运输服务3.因特网提供的运输服务 一.网络应用模型1.1 C/S模型&#xff08;client/server&#xff0c;客户/服务器模型&#xff09;定义工作原理功能特点优势应用 1.2 P2P&#xff08;peer to peer&#xff09;模型 与 P2P文件分发…

认识主被动无人机遥感数据、预处理无人机遥感数据、定量估算农林植被关键性状、期刊论文插图精细制作与Appdesigner应用开发

目录 第一章、认识主被动无人机遥感数据 第二章、预处理无人机遥感数据 第三章、定量估算农林植被关键性状 第四章、期刊论文插图精细制作与Appdesigner应用开发 更多推荐 遥感技术作为一种空间大数据手段&#xff0c;能够从多时、多维、多地等角度&#xff0c;获取大量的…

ubuntu20.04 安装 Qt5.15

目录 安装前工作 选择安装QT的哪个版本 安装时候选择哪些组件 安装Qt5.15 在线安装 我选择的组件 源码包安装 测试 安装前工作 ubuntu20.04.3安装Qt6.22操作步骤_ubuntu安装qt6_sonicss的博客-CSDN博客 # 安装g、gcc编译器 sudo apt-get install build-essential 安装l…

HTTP——二、简单的HTTP协议

本章将针对 HTTP 协议结构进行讲解&#xff0c;主要使用HTTP/1.1版本。学完这章&#xff0c;想必大家就能理解 HTTP 协议的基础了。 HTTP 一、HTTP协议用于客户端和服务器之间的通信二、通过请求和响应的交换达成通信三、HTTP是不保存状态的协议四、请求URI定位资源五、告知服…

spring-websocket在SpringBoot(包含SpringSecurity)项目中的导入

✅作者简介&#xff1a;大家好&#xff0c;我是 Meteors., 向往着更加简洁高效的代码写法与编程方式&#xff0c;持续分享Java技术内容。 &#x1f34e;个人主页&#xff1a;Meteors.的博客 &#x1f96d;本文内容&#xff1a;spring-websocket在SpringBoot(包含SpringSecurity…

途乐证券:沪指强势拉升涨0.63%,券商等板块走强,传媒板块活跃

31日早盘&#xff0c;两市股指全线走高&#xff0c;沪指一度涨超1%收复3300点&#xff0c;上证50指数盘中涨逾2%&#xff1b;随后涨幅有所收窄&#xff1b;两市成交额显着放大&#xff0c;北向资金净买入超90亿元。 到午间收盘&#xff0c;沪指涨0.63%报3296.58点&#xff0c;深…

ERROR in unable to locate ‘***/public/**/*‘ glob

前提 自己搭了一个react项目的脚手架&#xff0c;npm包下载一切都很正常&#xff0c;启动的时候突然就报ERROR in unable to locate ***/public/**/* glob这个错误&#xff0c;根据百度分析了一下产生的原因&#xff1a;webpack配置文件中的CopyWebpackPlugin导致的 网上给出的…

SpringBoot中间件—ORM(Mybatis)框架实现

目录 定义 需求背景 方案设计 代码展示 UML图 实现细节 测试验证 总结 源码地址&#xff08;已开源&#xff09;&#xff1a;https://gitee.com/sizhaohe/mini-mybatis.git 跟着源码及下述UML图来理解上手会更快&#xff0c;拒绝浮躁&#xff0c;沉下心来搞 定义&#x…

Mycat-Balance使用指南

MyCAT Balance是一个Java NIO的高性能负载均衡器&#xff0c;可以替代普通的硬件的交换机或其LVS类似的复杂机制&#xff0c;实现MyCAT集群的负载均衡。 MyCAT Balance的配置文件在conf目录下&#xff0c;frontend-conf.为前端配置&#xff0c;包括绑定的端口等&#xff0c;js…

政策加持智能家居市场,涂鸦赋能客户打造“以人为本”智能生活新方式

7月18日&#xff0c;商务部等13部门联合发布了《关于促进家居消费若干措施的通知》&#xff08;以下简称《通知》&#xff09;&#xff0c;《通知》指出&#xff0c;创新培育智能消费&#xff0c;支持企业运用物联网、云计算、人工智能等技术&#xff0c;着重加快智能家电、智能…

HDFS中namenode安全模式

HDFS中namenode安全模式 安全模式的现象探究step1step2step3step4 安全模式的概述控制进入时间和离开条件安全模式自动进入离开安全模式手动进入离开 安全模式的现象探究 step1 HDFS集群在停机状态下&#xff0c;使用hdfs -daemon命令逐个进程启动集群&#xff0c;观察现象首…

会议OA系统会议管理模块开发思路(layui搭建)

目录 一.为什么要进行开发 1.开发目的 2.项目流程 A.发起会议请求过程 1.首先实现我们的多选下拉框功能&#xff01; 2.时间组件功能&#xff0c;并且提交我们新增加的会议内容 3.在进行发起会议编码时遇到的问题&#xff0c;BUG 3.1.有点时候js访问不到路径 3.2在增加…

linux下docker安装、镜像下载、镜像基础操作、容器基础操作

目录 一、环境准备 1、开启虚拟化 2、关闭防火墙 3、yum仓库获取阿里源&#xff08;清华、京东都可以&#xff09; 4、确保能ping到外网 二、安装docker 1、yum安装docker 2、启动docker并设置开机自启 3、安装docker-ce阿里镜像加速器 三、docker基本操作 1、查看版…