首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
SAAS
ToB门户
了解全球最新的ToB事件
论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
微博
Follow
记录
Doing
博客
Blog
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
排行榜
Ranklist
相册
Album
应用中心
qidao123.com ToB IT社区-企服评测·应用市场
»
论坛
›
大数据
›
数据仓库与分析
›
【JavaEE初阶】线程池
返回列表
发新帖
【JavaEE初阶】线程池
[复制链接]
发表于 2026-2-9 13:46:45
|
显示全部楼层
|
阅读模式
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
×
目次
📕 弁言
🌳 概念
🍀ThreadPoolExecutor 类
🚩 int corePoolSize与int maximumPoolSize:
🚩 long keepAliveTime与TimeUnit nuit:
🚩 BlockingQueue workQueue:
🚩 ThreadFactory threadFactory:
🚩 RejectedExecutionHandler handler:
🎄尺度库中的线程池
🏠 模仿实现线程池
🙂 多线程初阶总结
🚩 包管线程
安全
的大抵思绪:
🚩对比线程和历程
📌线程的优点
📌历程与线程的区别
📕 弁言
之前呢我们对于并发编程,使用多线程就可以了,是由于线程比历程更轻量,在频仍创建和烧毁的时间,更有上风,随着期间的发展,对于"频仍"二字有了新的熟悉。之前一个
服务器
1s 处置处罚 1k 个哀求,就以为是频仍了。如今,一个
服务器
1s 要处置处罚几w的哀求......
那怎样优化呢? 我们就引入了线程池和协程(纤程)。本篇文章就来说说线程池,对于协程临时不表,在Java8中还不支持,后序在高
版本
的Java中,引入的"捏造线程"本质上就是协程。
为哈引入线程池大概协程就可以大概提升服从呢?
最关键的要点,直接创建/烧毁线程,是须要在用户态+内核态共同完成的工作,对于线程池/协程,只须要在用户态即可,不须要内核态的共同。
那为什么说用户态+内核态共同完成绩不敷高效?
例子:
🌳 概念
线程池,是一种线程的使用模式,它为了低沉线程使用中频仍的创建和烧毁所带来的资源斲丧与代价。
通过创建肯定命目的线程,让他们时间预备停当等候新使命的到达,而使命实行竣事之后再重新返来继承待命
想象这么一个场景:
假设有一个妹子,长得很悦目而且又有才华,想要谈一个对象,假如妹子和这个对象谈腻歪了,就想要换一个,本钱就比力高,服从就比力低,我须要先冷暴力他,斲丧他的耐烦,然后再提分手,分手完毕之后,还须要下一个小哥哥一点一点作育感情,如许服从确实很低。
为了进步服从,我就和在男朋侪的来往过程中,提前和其他小哥哥搞暧昧,先把感情作育到位,如许,我只要和现男友分手,反面这个暧昧的小哥就可以直接转正。如许的小哥就称为"备胎",假如我须要频仍的更换男朋侪,一个备胎不敷用,就须要多搞几个,这就构成了"备胎池"。如许服从就进步了
以是字符串常量池,
数据库
毗连池,线程池,历程池,内存池......头脑都一样,用来提升服从。
线程池最核心的筹划思绪
:复用线程,平摊线程的创建与烧毁的开销代价
相比于来一个使命创建一个线程的方式,使用线程池的上风体如今如下几点:
克制了线程的重复创建与开销带来的资源斲丧代价
提升了使命相应速率,使命来了直接选一个线程实行而无需等候线程的创建
线程的同一分配和管理,也方便同一的
监控
和调优
🍀ThreadPoolExecutor 类
尺度库提供的线程池紧张的类为:ThreadPoolExecutor
这个类使用起来比力复杂,构造方法很多,包罗很多参数(口试考点,问这些参数是什么意思)。
在资助手册java.util.concurrent(并发),这内里包罗了很多多线程干系的工具大概是类
构造方法:这内里有四个构造方法,过细观察发现内里的参数,越往下越全,以是我们只须要搞清楚末了一个,前三个也就清楚了。
这内里统共有7个参数,来说说这7个参数的意思:
🚩 int corePoolSize与int maximumPoolSize:
🚩 long keepAliveTime与TimeUnit nuit:
🚩 BlockingQueue<Runnable> workQueue:
🚩 ThreadFactory threadFactory:
🚩 RejectedExecutionHandler handler:
在使用线程池而且使用有界队列的时间,假如队列满了,使命添加到线程池的时间就会有标题,那么这些溢出的使命,ThreadPoolExecutor为我们提供了拒绝使命的处置处罚方式,以便在须要的时间按照我们的计谋来拒绝使命
线程池拒绝使命的机遇有以下两种:
第一种情况是当我们调用 shutdown 等方法关闭线程池后,即便此时大概线程池内部依然有没实行完的使命正在实行,但是由于线程池已经关闭,此时假如再向线程池内提交使命,就会遭到拒绝。
第二种情况是线程池没有本领继承处置处罚新提交的使命,也就是工作已经非常饱和的时间
尺度库提供了四个办理方案:
线程池使命拒绝计谋实现了 RejectedExecutionHandler 接口,JDK 中自带了四种使命拒绝计谋。分别是AbortPolicy、DiscardPolicy、DiscardOldestPolicy、CallerRunsPolicy。此中AbortPolicy是ThreadPoolExecutor默认使用。
1,AbortPolicy(默认)
这种拒绝计谋在拒绝使命时,会直接抛出一个类RejectedExecutionException的RuntimeException,让你感知到使命被拒绝了,于是你便可以根据业务逻辑选择重试大概放弃提交等计谋。
2,DiscardPolicy
这种拒绝计谋正如它的名字所形貌的一样,当新使命被提交后直接被扬弃掉,也不会给你任何的关照,相对而言存在肯定的风险,由于我们提交的时间根本不知道这个使命会被扬弃,大概造成数据丢失。
3,DiscardOldestPolicy
假如线程池没被关闭且没有本领实行,则会扬弃使命队列中的头结点,通常是存活时间最长的使命,这种计谋与第二种差异之处在于它扬弃的不是最新提交的,而是队列中存活时间最长的,如许就可以腾出空间给新提交的使命,但同理它也存在肯定的数据丢失风险。
4,CallerRunsPolicy
相对而言它就比力美满了,当有新使命提交后,假如线程池没被关闭且没有本领实行,则把这个使命交于提交使命的线程实行,也就是谁提交使命,谁就负责执使用命。如许做紧张有两点利益:
🎈第一点新提交的使命不会被扬弃,如许也就不会造成业务丧失。
🎈第二点利益是,由于谁提交使命谁就要负责执使用命,如许提交使命的线程就得负责执使用命,而执使用命又是比力耗时的,在这段期间,提交使命的线程被占用,也就不会再提交新的使命,减缓了使命提交的速率,相当于是一个负反馈。在此期间,线程池中的线程也可以充实使用这段时间来实行掉一部分使命,腾出肯定的空间,相当于是给了线程池肯定的缓冲期。
总结:
🎄尺度库中的线程池
由于尺度库自己也知道ThreadPoolExecutor使用起来比力费劲,于是尺度库自己提供了几个工厂类,对于上述线程池又进一步封装了.
在尺度库内里提供了一个 Executors类,这个类就是尺度库提供线程池的工厂类
有几个差异的
版本
:紧张使用前面两个
留意上述方法是有返回值的,
返回值范例为 ExecutorService
代码
一:我们可以看到是一个单独的线程,并非跟主线程是一个线程
代码
二:
使用 Executors.newFixedThreadPool(10) 能创建出固定包罗 10 个线程的线程池.
返回值范例为 ExecutorService
通过 ExecutorService.submit 可以注册一个使命到线程池中
🏠 模仿实现线程池
接下来我们简朴模仿实现一个简朴的线程池
创建MyThreadPool实现我们的线程池
使用壅闭队列构造全部使命
构造方法里创建相应巨细的线程数
提供一个submit方法使用线程池内里的线程
代码
:
测试:
🙂 多线程初阶总结
🚩 包管线程
安全
的大抵思绪:
1,使用没有共享资源的模子
2,实用共享资源只读,不写的模子
不须要写共享资源的模子
使用不可变对象
3,直面线程
安全
(重点)
包管原子性
包管序次性
包管可见性
🚩对比线程和历程
📌线程的优点
创建一个新线程的代价要比创建一个新历程小得多
与历程之间的切换相比,线程之间的切换须要操纵体系做的工作要少很多
线程占用的资源要比历程少很多
能充实使用多处置处罚器的可并行数目
在等候慢速I/O操纵竣事的同时,步调可实行其他的盘算使命
盘算麋集型应用,为了能在多处置处罚器体系上运行,将盘算分解到多个线程中实现
I/O麋集型应用,为了进步
性能
,将I/O操纵重叠。线程可以同时等候差异的I/O操纵
📌历程与线程的区别
历程是体系举行资源分配和调治的一个独立单元,线程是步调实行的最小单元。
历程有自己的内存地点空间,线程只独享指令流实行的须要资源,如寄存器和栈。
由于同一历程的各线程间共享内存和文件资源,可以不通过内核举行直接通讯。
线程的创建、切换及停止服从更高
回复
使用道具
举报
返回列表
浏览过的版块
Oracle
SAAS
物联网
DevOps与敏捷开发
分布式数据库
前端开发
公有云
linux
SQL-Server
刘俊凯
+ 我要发帖
登录后关闭弹窗
登录参与点评抽奖 加入IT实名职场社区
去登录
微信订阅号
微信服务号
微信客服(加群)
H5
小程序
快速回复
返回顶部
返回列表