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以及各類鎖來詳述多線程的原理和實線,敬請期待,寫的很差,但願多多賜教和點評,謝謝。

相關文章
相關標籤/搜索