当前位置:网站首页>【多线程】使用线程池、实现一个简单线程池
【多线程】使用线程池、实现一个简单线程池
2022-06-30 18:36:00 【51CTO】
目录
为什么要引入线程池
我们知道我们每次创建 启动 销毁一个线程的消耗是较大的 所以引入线程池的最大的好处就是减少每次启动 销毁线程的损耗
那么他是如何实现减少的?
在线程池里有一个阻塞队列 他会记录并储存要执行的任务 并且他内部又会有一个或者几个线程去取队列的首元素任性任务
简单举个例子:
就是 有一个快递站 来一个快递 快递站老板就会雇佣一个学生去送快递 然后马上解雇人家 再来一个快递他又会雇佣一个学生 然后解雇 此时他会发现 这样雇佣解雇太费事 于是他就雇佣一个或者一个学生 然后又将来的快递都拿一个本本记录下来 让着几个学生去轮流看这个本本上要送的快递 然后各自再去送快递 这样就是一个线程池
为什么线程池子比系统申请释放快?
为了理解这个问题,我们就得理解一组重要的概念。
在
操作系统中,我们分成两种状态:1、用户态2、内核态

为了加深对“内核态” 和 “用户态”的理解.
举一个形象的例子:

下面,我们来看一下 Java标准库中是怎样的体现。
老规矩,先来学习一下 Java 保准库中,线程池的使用。
然后再自己实现一个线程池。
Java标准库中的线程池使用
ThreadPoolExecutor
创建线程池其中参数的理解
corePoolSize: 核心线程数
maximumPoolSize: 最大线程数
keepAliveTime: 空闲时间数量
unit: 空闲时间单位
workQueue: 阻塞/任务/工作队列
threadFactory: 线程创建的工厂
handler: 拒绝策略
ThreadPoolExecutor

Executors
标准库中还提供了一个简化版本的线程池 ----》
Executors
Executors:本质是针对 ThreadPoolExecutor 进行了封装,提供了一些默认参数。
我们现在来看一下Executors是怎么用的?顺便我们就按照这个来模拟是一个线程池。

下面就使用第一个 newFixedThreadPool 方法。来实现一个任务

线程池执行流程

根据上图场景,我们可以将自己想象成快递站的老板,试想一下,假如此时一有人过来寄东西了,那我就雇佣一个临时工,等处理完了,立马就将他解雇,可以是可以,但是好像不太划算,毕竟频繁的雇佣解雇临时工开销开始比较大的.
灵机一动,我决定按照自己店里的实际需要,聘请 3 位正式员工,要是他们仨都忙着,那我就将要寄出的包裹先放在我的小店里,等他们三个将手里的包裹处理完了之后,就继续处理小店里堆积的包裹,开销也不是很大,日子过的云淡风轻~
但是没想到,618活动来的让我措手不及,很快我的小店就堆满了,三个正式员工也处理不过来,那这个时候还有人来寄包裹可怎么办,不能伤了寄件人的心呀~为了展示我们的实力,小店虽小,还是能多站下几个人的,不要慌,我再雇佣临时工不就好了嘛,场地限制,我的店里最多只能站6个人,也就是我最多同时只能雇3个临时工,这下舒坦了.
但是好日子没几天,还是我太稚嫩,低估了消费者的实力,很快,包裹堆满了小店,看着他们六个人忙的不可开交,我也是心疼,此时,还有源源不断的人来寄包裹,这下,我是真的没有办法啦,该伤的心还是得伤,心有余而力不足,只好拒绝并告知他们另寻他处吧~
当完老板再留恋不舍也要缓过神来呀,再对照上面流程图理解一下线程池吧~核心线程对应到的是3个正式员工,阻塞队列对应到快递小店的存储包裹区,线程池对应到小店的前台(最多能站6个人).
手动实现线程池
线程池里面都有什么?
1、先能够
描述任务------> 直接使用Runnable即可2、需要
组织任务----- > 直接使用BlockingQueue阻塞队列3、描述工作线程
4、组织工作线程
5、需要实现,往线程池添加任务。
我要实现的线程池,不光要管理任务 和 线程,还需要它们相互配合。
- 有一个类描述具体线程是干啥的(借助Runnable实现)
- 需要一个阻塞队里去记录若干任务BlockingQueue
- 需要一个类去工作实现线程
- 需要一个链表去存储所有线程 方便我们shutdown所有线程
代码

边栏推荐
- Year after year, why is breaking the data island still the primary task of enterprise development
- 项目配置了eslint,编辑器没有关闭eslint功能的情况下,eslint没有生效
- 「干货」数据分析常用的10种统计学方法,附上重点应用场景
- Memory Limit Exceeded
- 新版EasyGBS如何配置WebRTC视频流格式播放?
- Coding officially entered Tencent conference application market!
- Connect to lab server
- Mipi protocol in RFFE
- 【已解决】抖音如何取消关注已注销的账户
- Pyth Solana is a bridge connecting reality on the chain
猜你喜欢

SQL continuous login problem

Ansi/ul 94 class 5-V vertical combustion test

Code shoe set - mt3435 · assignment - bipartite graph problem - Graphic explanation

Sqlserver SQL Server Management Studio and transact SQL create accounts and create read-only users to access the specified database

小球大小随机,随机运动碰撞

德国AgBB VoC有害物质测试

Unlimited cloud "vision" innovation | the 2022 Alibaba cloud live summit was officially launched

程序员女友给我做了一个疲劳驾驶检测

ANSI/UL 94 5-V级垂直燃烧试验

假期安全不放假,VR交通让孩子安全出行|广州华锐视点
随机推荐
成长一夏 挑战赛来袭 专属社区福利来袭~免费获得CSDN定制T恤衫
slice
How to use the low code platform of the Internet of things for service management?
Business Intelligence BI and business management decision-making thinking 4: business cost analysis
Teach you how to write selenium test cases
ArcGIS no plug-in load (no offset) day map
Configure server environment
Task04:集合运算-表的加减法和join等--天池龙珠计划SQL训练营学习笔记
mysql函数获取全路径
Alibaba Tianchi SQL training camp learning notes 5
图扑软件通过 CMMI5 级认证!| 国际软件领域高权威高等级认证
商业智能BI与业务管理决策思维之四:业务成本分析
项目配置了eslint,编辑器没有关闭eslint功能的情况下,eslint没有生效
Trust configuring domestic sources
20200525 Biotechnology - Sichuan Normal University self taught Biotechnology (undergraduate) examination plan txt
Safe holidays without holidays, VR traffic makes children travel safely | Guangzhou Sinovel viewpoint
Understanding of event queue, micro task and macro task and interview questions
VMware16安装Win11虚拟机(最全步骤+踩坑)
MySQL function to get the full path
German agbb VOC hazardous substances test