java线程池常见面试题

C#中的线程池详细介绍 前言一、工作原理1、线程池的创建和管理2、线程池队列的工作流程二、使用方法1、提交任务到线程池2、异步操作与线程池三、控制线程池的行为1、线程池的参数设置2、最大线程数和最小线程数的影响四、注意事项1、避免阻塞线程池线程2、异常处理和错误处理机制五、与异步编程模型的关系1、APM与线程池2、TPL与线程池六、总结线程池是一种用于管理和调度线程的机制,它在应用程序中起着重要的作用。 阅读详情

什么是线程池?
线程池是一种多线程处理形式,处理过程中将任务提交到线程池,任务的执行交由线程池来管理。
如果每个请求都创建一个线程去处理,那么服务器的资源很快就会被耗尽,使用线程池可以减少创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。
为什么要使用线程池?
创建线程和销毁线程的花销是比较大的,这些时间有可能比处理业务的时间还要长。这样频繁的创建线程和销毁线程,再加上业务工作线程,消耗系统资源的时间,可能导致系统资源不足。(我们可以把创建和销毁的线程的过程去掉)
线程池有什么作用?
线程池作用就是限制系统中执行线程的数量。
1、提高效率 创建好一定数量的线程放在池中,等需要使用的时候就从池中拿一个,这要比需要的时候创建一个线程对象要快的多。
2、方便管理 可以编写线程池管理代码对池中的线程同一进行管理,比如说启动时有该程序创建100个线程,每当有请求的时候,就分配一个线程去工作,如果刚好并发有101个请求,那多出的这一个请求可以排队等候,避免因无休止的创建线程导致系统崩溃。
说说几种常见的线程池及使用场景
1、newSingleThreadExecutor
创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
2、newFixedThreadPool
创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
3、newCachedThreadPool
创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
4、newScheduledThreadPool
创建一个定长线程池,支持定时及周期性任务执行。
线程池中的几种重要的参数
corePoolSize就是线程池中的核心线程数量,这几个核心线程,只是在没有用的时候,也不会被回收
maximumPoolSize就是线程池中可以容纳的最大线程的数量
keepAliveTime,就是线程池中除了核心线程之外的其他的最长可以保留的时间,因为在线程池中,除了核心线程即使在无任务的情况下也不能被清 除,其余的都是有存活时间的,意思就是非核心线程可以保留的最长的空闲时间,
util,就是计算这个时间的一个单位。
workQueue,就是等待队列,任务可以储存在任务队列中等待被执行,执行的是FIFIO原则(先进先出)。
threadFactory,就是创建线程的线程工厂。
handler,是一种拒绝策略,我们可以在任务满了之后,拒绝执行某些任务。
说说线程池的拒绝策略
当请求任务不断的过来,而系统此时又处理不过来的时候,我们需要采取的策略是拒绝服务。RejectedExecutionHandler接口提供了拒绝任务处理的自定义方法的机会。在ThreadPoolExecutor中已经包含四种处理策略。
AbortPolicy策略:该策略会直接抛出异常,阻止系统正常工作。
CallerRunsPolicy 策略:只要线程池未关闭,该策略直接在调用者线程中,运行当前的被丢弃的任务。
DiscardOleddestPolicy策略: 该策略将丢弃最老的一个请求,也就是即将被执行的任务,并尝试再次提交当前任务。
DiscardPolicy策略:该策略默默的丢弃无法处理的任务,不予任何处理。
除了JDK默认提供的四种拒绝策略,我们可以根据自己的业务需求去自定义拒绝策略,自定义的方式很简单,直接实现RejectedExecutionHandler接口即可。
execute和submit的区别?
在前面的讲解中,我们执行任务是用的execute方法,除了execute方法,还有一个submit方法也可以执行我们提交的任务。
这两个方法有什么区别呢?分别适用于在什么场景下呢?我们来做一个简单的分析。
execute适用于不需要关注返回值的场景,只需要将线程丢到线程池中去执行就可以了。
submit方法适用于需要关注返回值的场景
五种线程池的使用场景
newSingleThreadExecutor:一个单线程的线程池,可以用于需要保证顺序执行的场景,并且只有一个线程在执行。
newFixedThreadPool:一个固定大小的线程池,可以用于已知并发压力的情况下,对线程数做限制。
newCachedThreadPool:一个可以无限扩大的线程池,比较适合处理执行时间比较小的任务。
newScheduledThreadPool:可以延时启动,定时启动的线程池,适用于需要多个后台线程执行周期任务的场景。
newWorkStealingPool:一个拥有多个任务队列的线程池,可以减少连接数,创建当前可用cpu数量的线程来并行执行。
线程池的关闭
关闭线程池可以调用shutdownNow和shutdown两个方法来实现
shutdownNow:对正在执行的任务全部发出interrupt(),停止执行,对还未开始执行的任务全部取消,并且返回还没开始的任务列表。
shutdown:当我们调用shutdown后,线程池将不再接受新的任务,但也不会去强制终止已经提交或者正在执行中的任务。
初始化线程池时线程数的选择
如果任务是IO密集型,一般线程数需要设置2倍CPU数以上,以此来尽量利用CPU资源。
如果任务是CPU密集型,一般线程数量只需要设置CPU数加1即可,更多的线程数也只能增加上下文切换,不能增加CPU利用率。
上述只是一个基本思想,如果真的需要精确的控制,还是需要上线以后观察线程池中线程数量跟队列的情况来定。
线程池都有哪几种工作队列
1、ArrayBlockingQueue
是一个基于数组结构的有界阻塞队列,此队列按 FIFO(先进先出)原则对元素进行排序。
2、LinkedBlockingQueue
一个基于链表结构的阻塞队列,此队列按FIFO (先进先出) 排序元素,吞吐量通常要高于ArrayBlockingQueue。静态工厂方法Executors.newFixedThreadPool()使用了这个队列
3、SynchronousQueue
一个不存储元素的阻塞队列。每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态,吞吐量通常要高于LinkedBlockingQueue,静态工厂方法Executors.newCachedThreadPool使用了这个队列。
4、PriorityBlockingQueue
一个具有优先级的无限阻塞队列。

Java线程池常见面试题 execute()和submit()方法的区别是什么?submit()方法返回的Future对象有什么作用?线程池中的线程抛出未捕获异常会导致什么后果?线程池预热(prestart)是什么意思?Java中创建线程池的主要方式有哪些?为什么要使用线程池?线程池中的空闲线程是如何回收的?如何捕获线程池中任务的异常?线程池中的线程是如何复用的?线程池中的线程是如何创建的?如何监控线程池的运行状态?Java线程池常见面试题。线程池的核心参数有哪些?如何合理配置线程池大小?线程池有哪些拒绝策略?如何正确关闭线程池? 阅读详情

相关推荐

Java线程池常见面试题及答案整理

本文专为准备Java面试的开发者设计,覆盖线程池从基础到进阶的常见问题。无论是初级工程师(考察核心概念)还是高级工程师(考察源码理解、参数调优),都能通过本文系统掌握线程池的底层逻辑和面试应答技巧。本文先通过“餐厅服务员”的生活案例引出线程池核心概念,再拆解常见面试题(附详细解答逻辑),最后结合实战代码演示线程池的正确使用方式。线程池(Thread Pool):管理一组线程的资源池,通过复用线程避免频繁创建/销毁的开销。核心线程数(corePoolSize)

Java大师兄的博客 1310

java线程池 面试题(精简)

什么是线程池? 线程池是一种多线程处理形式,处理过程中将任务提交到线程池,任务的执行交由线程池来管理。 如果每个请求都创建一个线程去处理,那么服务器的资源很快就会被耗尽,使用线程池可以减少创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。   为什么要使用线程池? 创建线程和销毁线程的花销是比较大的,这些时间有可能比处理业务的时间还要长。这样频繁的创建线程和销毁线程,再...

Linias的博客 6万+

【Java并发】线程池常见面试题

思路:创建多个线程池(对应不同优先级),提交任务时根据优先级选择对应的线程池执行。高优先级任务提交到(核心线程数多、队列容量小),低优先级任务提交到。优点:实现简单,优先级隔离(高优先级任务不会被低优先级任务阻塞);缺点:资源占用多(多个线程池),可能导致低优先级线程池资源闲置。示例代码// 高优先级线程池(核心线程数多,队列容量小)// 低优先级线程池(核心线程数少,队列容量大)// 提交任务时指定优先级} else {思路:任务实现Comparable接口,通过“

完全体 1133

AWSL面试又凉凉了 ,记录一下

字节跳动面试 面试官大佬很好人,就是我太菜了emmmmmmmm 1.对象从加载到初始化的过程, 2.对象存在父类代码的初始化过程, 3.对象存放的地方在哪里,对象如何线程安全,synchronized和lock的不同,synchronized修饰的代码块可重入吗 当线程尝试获取锁时,可重入锁先尝试获取并更新status值,如果status == 0表示没有其他线程在执行同步代码,则把st...

zzzzzzz的博客 1395

告别交越失真:手把手教你设计高性能互补输出级电路(LTspice实测)

本文深入剖析音频放大器中常见的交越失真问题,并提供基于LTspice仿真的实战解决方案。通过对比二极管偏置、Vbe倍增器和集成运放驱动三种经典方案,手把手指导设计高性能互补输出级电路,涵盖原理分析、仿真验证及实物调试要点,助力消除音频失真,提升音质。

weixin_29190573的博客 552

避坑指南:ZYNQ PS端读写BRAM时容易忽略的5个配置细节(基于Vivado 2022.1)

本文基于Vivado 2022.1,总结了ZYNQ PS端读写单口BRAM时5个易被忽略的关键配置细节。内容涵盖关闭Safety Circuit以优化时序、精确匹配AXI控制器与BRAM的地址深度、注意PS端函数位宽与地址对齐、正确连接时钟复位域,并提供了实用的调试技巧与诊断代码,帮助工程师规避常见陷阱,确保数据交互稳定可靠。

net55的博客 374

C#多线程编程(3)-线程池ThreadPool

在面向对象编程中,经常会面对创建对象和销毁对象的情况,如果不正确处理的话,在短时间内创建大量对象然后执行简单处理之后又要销毁这些刚刚建立的对象,这是一个非常消耗性能的低效行为,所以很多面向对象语言中在内部使用对象池来处理这种情况,以提高性能,比如在ADO.NET内部就允许使用数据库连接池来提高性能,在JDBC中没有提供数据库连接池,一些开发人员为了提高效率就自己编写数据库连接池来提高性能,当然

yuanpan的专栏 1333

从时序参数到电压供给:TTL(RGB)液晶屏驱动调试全解析

本文全面解析TTL(RGB)液晶屏驱动调试的关键技术,从时序参数配置到电压供给系统搭建,详细介绍了同步信号参数、寄存器配置技巧以及升压电路设计。通过实战案例和常见故障分析,帮助工程师快速掌握液晶显示屏调试方法,提升开发效率。

weixin_30588675的博客 247

Java 并发编程面试题——线程池

本文主要参考《Java 并发编程的艺术》这本书,对面试中与线程池有关的面试题进行了总结。

代码星辰的博客 3645

地平线天工开物AI开发平台实战:从量化训练到模型部署的完整指南

本文提供了地平线天工开物(OpenExplorer)AI开发平台的实战指南,详细解析了从量化训练到模型部署的完整流程。文章重点对比了量化感知训练(QAT)与训练后量化(PTQ)两条核心路径的优劣与适用场景,并分享了图像分类模型PTQ部署的实战经验与常见问题调试技巧,旨在帮助开发者高效地将AI模型部署到地平线AI芯片上。

weixin_29046035的博客 456

Win11更新导致TIA博途许可证出现问题的解决办法汇总

Win11更新导致TIA博途许可证出现问题的解决办法汇总

Robot_PLC_HMI_Automation 9896

java线程池面试题有哪些?java线程池常见面试题

进行java面试的过程中,java线程池是必问的面试题目,因为这是java的重点知识,也是在java工作中经常会遇到的,那java线程池面试题有哪些?下面来我们就来给大家讲解一下java线程池常见面试题。 1.了解过线程池的工作原理吗? 当线程池中有任务需要执行时,线程池会判断如果线程数量没有超过核心数量就会新建线程池进行任务执行,如果线程池中的线程数量已经超过核心线程数,这时候任务就会被放入任务队列中排队等待执行;如果任务队列超过最大队列数,并且线程池没有达到最大线程数,就会新建线程来执行任务;如果超过了

muli525的博客 1786

万字长文带你由浅入深夯实ARM汇编基础——汇编指令及寻址方式最全梳理(附示例)!

见到汇编就害怕?读完这篇,扫除汇编拦路虎!!(示例丰富,可做手册,随手查阅!)

车载系统攻城狮 1万+

Java线程池常见面试题详解

CachedThreadPool 和上一种线程池 FixedThreadPool 的情况恰恰相反,FixedThreadPool 的情况是阻塞队列的容量是无限的,而这里 CachedThreadPool 是线程数可以无限扩展,所以 CachedThreadPool 线程池并不需要一个任务队列来存储任务,因为一旦有任务被提交就直接转发给线程或者创建新线程来执行,而不需要另外保存它们。每当提交一个任务就创建一个工作线程,如果工作线程数量达到线程池初始的最大数,则将提交的任务存入到池队列中。

m0_51431003的博客 1467

基于YOLO26深度学习框架的文档表格识别系统的算法研究实现方法

本文研究了基于YOLO26深度学习框架的文档表格识别系统实现方法。系统采用YOLO26网络架构,通过数据预处理、模型训练、检测推理和表格分析四个模块实现高效表格识别。研究详细阐述了数据归一化、增强等技术处理,以及采用迁移学习策略优化模型训练过程。实验表明,该系统能有效识别多种表格结构并生成结构化数据,为文档自动化处理提供了可靠解决方案。

一键难忘的博客 972

【人工智能】《Deep Dive into LLMs like ChatGPT 》—— Andrej Karpathy 第三阶段:强化学习(Reinforcement Learning, RL)

摘要:强化学习(RL)阶段通过让模型自主生成并验证答案,突破SFT阶段的模仿局限,使其在数学、代码等领域形成独特的推理路径。RL流程包括批量生成解答、自动批改筛选正确路径,并采用PPO/GRPO算法优化模型。模型会自发涌现自我检查、回滚等策略,显著提升正确率(如AIME竞赛准确率从15%升至56%)。与SFT模型相比,RL模型具备主动链式思维、验算能力,响应时间更长但效果更优,形成真正的“思考模型”。三阶段对比显示,RL通过可验证题的对错奖励机制,赋予模型超越人类范式的推理能力。

奶爸的编程之路,也就一周冷个三天 149

java面试题:线程、线程池、锁常见的15道面试题【面试时必须能说出来】

目录 1、创建线程有哪几种方式 1.继承Thread类 2.实现Runnable接口 3.实现Callable接口 4.线程池方式 2、线程池的七大参数? 3、线程池的工作原理? 4、ThreadPoolExecutor 有哪些常用的方法? 5、说说submit()和 execute两个方法有什么区别? 6、shutdownNow() 和 shutdown() 两个方法有什么区别? 7、线程池中核心线程数量大小怎么设置? 8、线程池为什么需要使用(阻塞)队列? 9、线程池为什么要使

m0_63270506的博客 4372

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

java线程池面试题_Java常见面试题:线程池

最近面试过一些候选人,面试过程中,我比较倾向于问一些偏基础又较为开放的问题,用来看看候选人基础能力怎么样,比如线程池,提问过程一般类似如下:我先问候选人平时怎么使用线程池,得到的结果不出意外就是两种:1.我不用线程池,工作中没接触过并发;2.用Executors.newCachedThreadPool;不管是哪一种回答,我还是希望能从候选人那里得到他们对线程池的理解,因此还是会问一下ThreadP...

weixin_39714835的博客 256

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Java初中级面试题:有哪几种常见的线程池?

hello啊,各位观众姥爷们!!!本baby今天又来报道了!哈哈哈哈哈嗝🐶Java 线程池的核心是类,通过不同参数组合实现多种线程池策略。fill:#333;color:#333;color:#333;fill:none;突发流量任务堆积OOM内存溢出。

牛马baby的博客 863

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

JAVA 线程池原理,java常见数据结构与算法面试题

其中AtomicInteger变量ctl的功能非常强大:利用低29位表示线程池中线程数,通过高3位表示线程池的运行状态: RUNNING:-1 << COUNT_BITS,即高3位为111,该状态的线程池会接收新任务,并处理阻塞队列中的任务; SHUTDOWN: 0 << COUNT_BITS,即高3位为000,该状态的线程池不会接收新任务,但会处理阻塞队列中的任务; STOP : 1 << COUNT_BITS,即高3位为001,该状态的线程不会接收新任务,也不会处理

m0_64867092的博客 158

Java面试题:描述Java线程池的概念、用途及常见的线程池类型。介绍一下Java中的线程池有哪些优缺点

Java线程池是一种管理和复用线程的机制,它允许在需要执行任务时,从线程池中获取一个空闲线程来执行,而不需要每次都创建和销毁线程。线程池主要解决了线程生命周期的开销和资源消耗问题,通过复用已创建的线程,避免了频繁创建和销毁线程的开销,从而提高了系统的性能和资源管理效率。线程池的用途广泛,包括提高多线程的效率和性能,限制系统中并发线程的数量以避免资源耗尽,提供线程管理和监控功能,以及控制任务的排队和执行顺序。简化线程管理:线程池封装了线程的创建、销毁和调度等操作,使得线程的管理更加简单和方便。

杰哥在此的专栏 472

java核心技术-线程池基本原理以及常见面试题

文章目录线程池的实现原理线程池类继承关系ThreadPoolExecutorExecutor四种工具类ScheduledThreadPoolExecutorCompletableFuture用法 线程池的实现原理 线程池类继承关系 ThreadPoolExecutor Executor四种工具类 ScheduledThreadPoolExecutor CompletableFuture用法 ...

dreamzuora的博客 633

阿里常见面试题----Java线程池使用,解读

Java线程池是Java并发编程中非常重要的一部分,它可以让我们更好地管理和控制线程。本题要求实现一个Java线程池,具体要求如下: 线程池大小由参数指定,当线程池中的线程空闲一段时间后,可以自动缩小线程池的大小。 线程池应当能够处理固定大小的任务队列,如果任务队列已满,则拒绝新任务。 线程池应当能够动态地扩大或缩小线程池的大小,以处理更多的任务。

vfast_ww的博客 164

JAVA面试题分享二十八:几种常见的内置线程池?

被称为可重用固定线程数的线程池。通过Executors/*** 创建一个可重用固定数量线程的线程池*/另外还有一个的实现方法,和上面的类似,所以这里不多做阐述:从上面源代码可以看出新创建的的和都被设置为nThreads,这个nThreads参数是我们使用的时候自己传递的。即使的值比大,也至多只会创建个线程。这是因为使用的是容量为的(无界队列),队列永远不会被放满。的execute()如果当前运行的线程数小于, 如果再来新任务的话,就创建新的线程来执行任务;当前运行的线程数等于。

之乎者也·的博客 973

postgres 支持的线程数_Java常见面试题:线程池

最近面试过一些候选人,面试过程中,我比较倾向于问一些偏基础又较为开放的问题,用来看看候选人基础能力怎么样,比如线程池,提问过程一般类似如下:我先问候选人平时怎么使用线程池,得到的结果不出意外就是两种:1.我不用线程池,工作中没接触过并发;2.用Executors.newCachedThreadPool;不管是哪一种回答,我还是希望能从候选人那里得到他们对线程池的理解,因此还是会问一下ThreadP...

weixin_39615741的博客 176
上一篇: springboot日志
下一篇: Python基础day12飞机大战
Tableau1
博客等级 码龄8年 0粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值