IOS - 大话《多线程》

时间: 2月26日22点markdown

地点: 永旺商场多线程

背景: 隔壁空地上的商场终于建成了,大大小小的商店纷纷入驻,大A发现了商机,想开一家奶茶店,话很少说,交钱干。ide

1、开店(进程)

大A是个踏实肯干的人,开店之初啊,也没想那么多,就想踏踏实实挣点小钱,因而乎把本身的这些想法告诉了设计师,设计师一想,好办:oop

  • 1间内部操做室和一些调配机器
  • 1台收银机
  • 1个收银员+3名奶茶调配员

齐活,说干就干,不到一个月店面就装修好了,因而乎按照设计师的规划招了4个小姐姐。性能

2020年2月26日,随着一顿鞭炮声大A的奶茶店终于开张了,陆陆续续来了不少顾客...idea

咱们把商场当作一个系统,那么咱们的奶茶店就是一个进程,固然咱们的商场还有 H&M啊、
优衣库啊,你懂的!这些店之间互不干扰,各自开门各自作生意,互不影响...
复制代码

开业之初效果:spa

这个店(进程)就这样红红火火开起来了...线程

系统(System):商场
进程(Process):奶茶店
线程(Thread):员工的平常工做
进程是系统中正在运行的一个应用程序,每一个进程之间是独立的
(你卖你的奶茶,我卖个人衣服,YES!)
复制代码

2、员工平常工做(线程)

奶茶店天天都有不少活:设计

  • 进货,分装原料
  • 派单收银
  • 奶茶调配

天天咱们奶茶店都要开门,只有开门了员工才能进来,才能干活,这是核心门槛(主线程),全部员工干活才让奶茶店运营起来(线程是进程的基本执行单元)code

线程(thread):进程的基本执行单元,一个进程的全部任务都在线程中执行,
进程要想执行任务必需要有线程,程序会默认开启一条线程,这条线程叫‘主线程’
复制代码

3、扩张(开辟新线程)

大A仍是很踏实肯干的,天天卖命的吆喝,生意也是愈来愈好,这一每天的,人都排到马路对面了...

期间不断的有人跟大A说:老板啊,多招点人撒,搞两个收银的,排两个队,这大热天的咱们等的也是很难受啊,有的人等不了就去别家买了,你也损失不是...

大A一想,也是啊,那么就试试,又找了设计师,此次相对比较简单,就是加台收银机嘛,你再额外招个小姐姐就行了,因而乎店门关了两周,终于算是装修好了: 艾玛果真好多了,至少如今顾客都能进屋吹空调了,哈哈,惟独就多招了一个收银小姐姐而已,这买卖划算啊...

3.1 同时派单出错

因为天天的原料有限,并且不一样的品种的奶茶数量也是有限的,常常小B刚派了一杯🍑🍑🍑口味的,小C也派了一杯🍑🍑🍑口味的,后台一看,MMP

因而乎,后台就给两位小姐姐提了个idea,大家卖奶茶的时候提早问一下(加锁)我这边还能作几杯,能作就走单,不能就告知客户,哦了,屌屌的。

3.2 圆桌区域变小

可是有的顾客又提问题了,如今却是好排队了,可是买了也没地方坐了,原来新的队列占了原来圆桌的区域,致使圆桌变少了,没办法嘛,商场就给我分配这么大的空间,空间有限呀,只能少两张桌子了,也是为了你们更快的喝上奶茶嘛,坐哪重要吗?哈哈!

3.3 员工很累

开始几天搞促销,大伙热热烈烈的,几天以后小姐姐B就开始抱怨了,如今两个收银员一块儿派单,仍是咱们三我的来配料。真的是...

3.4 死锁

有一天后台调配师小C和收银小B闹矛盾了,讲道理是不可能讲道理了:

老板一听,你俩玩起死锁来了,我这店还开个锤子哦~

经过上面种种,咱们分析多线程的优缺点得出:

多线程优势
- 开辟线程能提升程序执行效率(派单更快了)
- 能适当提升资源利用率CPU,内存(后台均可以忙活起来)
- 线程上的任务执行完后,线程会自动销毁(某一队没人了,收银员小姐姐就开始刷抖音了)
多线程缺点
- 开辟线程须要占用必定的内存空间(圆桌区域变小了)
- 程序更加复杂,线程间通信,多线程数据共享(同时派单问题,加锁问题)
- 开启大量线程,会占用大量内存空间,下降程序性能(小姐姐表示好累)
- 线程越多CPU在线程上的开销越大(小姐姐不够用了,须要更多的小姐姐来配合)
复制代码

4、总结

至此咱们关于进程和线程的故事讲的差很少了,你弄明白了吗,下面咱们补充一些其余的知识点。

4.1 线程生命周期

  • 新建
  • 就绪
  • 运行
  • 阻塞
  • 死亡

4.2 线程建立策略

话很少说,图示很详细:

4.3 线程和runloop的关系

  1. runloop与线程是一一对应的,一个runloop对应一个核心线程。
  2. runoop是用来管理线程的,当线程的runloop被开启后,线程会在执行任务完毕后进入休眠状态,当有了新任务的时候就会被唤醒去执行任务。
  3. runloop在第一次获取时被建立,在线程结束时被销毁。
  4. 对于主线程来讲,runloop在程序一启动就默认建立好了。
  5. 对于子线程来讲,runloop是懒加载的,只有当咱们使用时才建立,因此子线程在使用定时器的时候要确保子线程的runloop被建立,否则定时器不会回调。

后面我会针对GCD以及各类锁来详述多线程的原理和实线,敬请期待,写的很差,但愿多多赐教和点评,谢谢。

相关文章
相关标签/搜索