当前位置:网站首页>【多线程】使用线程池、实现一个简单线程池
【多线程】使用线程池、实现一个简单线程池
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所有线程
代码

边栏推荐
- The project is configured with eslint. When the editor does not close the eslint function, the eslint does not take effect
- VoIP Push 在海外音视频业务中的应用
- Temperature measuring instrument based on STM32 single chip microcomputer
- How to configure webrtc video stream format playback in the new version of easygbs?
- 20220528 [talk about fake chips] those who are greedy for cheap often suffer heavy losses. Take stock of those fake memory cards and solid state drives
- go之web框架 iris
- Sqlserver SQL Server Management Studio and transact SQL create accounts and create read-only users to access the specified database
- Opengauss database source code analysis series articles -- detailed explanation of dense equivalent query technology (Part 1)
- Evolution of screen display technology
- Electron 入门
猜你喜欢

Kalman filter -- Derivation from Gaussian fusion

Safe holidays without holidays, VR traffic makes children travel safely | Guangzhou Sinovel viewpoint

Ansi/ul 94 class 5-V vertical combustion test

美国服务器租用和托管服务哪个好?

Brief introduction of Feature Engineering in machine learning

Why do more and more people choose cloud rendering?

How to use the low code platform of the Internet of things for service management?

Redis beginner to master 01

Promise从认识到使用

测试人进阶技能:单元测试报告应用指南
随机推荐
开发那些事儿:Linux系统中如何安装离线版本MySQL?
MySQL modify data type_ MySQL modify field type [easy to understand]
How to configure webrtc video stream format playback in the new version of easygbs?
torch. roll
Huaxing Securities: kitex practice under the original hybrid Cloud Architecture
德国AgBB VoC有害物质测试
The project is configured with eslint. When the editor does not close the eslint function, the eslint does not take effect
Force deduction ----- count the string containing the given prefix
【PHP】自研框架QPHP,qphp框架使用
Cobbler is easy to use
Electron 入门
码蹄集 - MT3111· 赋值
配置服务器环境
究竟有哪些劵商推荐?另外,手机开户安全么?
Whether the SQL is indexed
MQ组成部分(2022.5.16-5.22)
【DesignMode】单例模式(singleton pattern)
Development: how to install offline MySQL in Linux system?
MySQL function to get the full path
Word -- a solution for word to encounter errors when trying to open a file