
11111.jpg
基本概念
做一個表格方便理解相關(guān)的包含關(guān)系
| 進程 | 線程 | 多線程 | |
|---|---|---|---|
| 定義 | 進程是指在系統(tǒng)中正在運行的一個應(yīng)用程序。每個進程之間是獨立的,每個進程均運行在其專用且受保護的內(nèi)存空間內(nèi) | 1個進程要想執(zhí)行任務(wù),必須得有線程(每1個進程至少要有1條線程),1個進程(程序)的所有任務(wù)都在線程中執(zhí)行 | 1個進程中可以開啟多條線程,每條線程可以并行(同時)執(zhí)行不同的任務(wù)。 |
| 例 | 我們同時打開迅雷、QQ、系統(tǒng)就會分別啟動2個進程 | 酷狗播放音樂、使用迅雷下載電影,都需要在線程中執(zhí)行 | 進程—>車間,線程—>車間工人 |

WX20171116-101717.png

WX20171116-101906.png
線程的串行(C語言環(huán)境下)
1個線程中的任務(wù)的執(zhí)行是串行的。如果要在一個線程中執(zhí)行多個任務(wù),那么只能一個一個地按順序執(zhí)行這些任務(wù)。也就是說,在同一時間內(nèi),1個線程只能執(zhí)行1個任務(wù),具體串行并行同步異步會在之后的文章中解釋。。。
比如在1個線程中下載3個文件(文件A、文件B、文件C)如果是串行執(zhí)行,因此,可以認為線程是進程中的 1條執(zhí)行路徑
多線程
多線程的原理
- 同一時間,CPU只能處理1條線程,只有1條線程在工作(執(zhí)行)
- 多線程并發(fā)(同時)執(zhí)行,其實是CPU快速地在多條線程之間調(diào)度(切換)
- 如果CPU調(diào)度線程的時間足夠快,就造成了多線程并發(fā)執(zhí)行的假象
多線程優(yōu)缺點
多線程優(yōu)點
- 能適當(dāng)提高程序的執(zhí)行效率
- 能適當(dāng)提高資源利用率(CPU、內(nèi)存利用率),充分發(fā)揮多核處理器優(yōu)勢,將不同線程任務(wù)分配給不同的處理器,真正進入“并行運算”狀態(tài)
- 將耗時、輪詢或者并發(fā)需求高等任務(wù)分配到其他線程執(zhí)行,并由主線程負責(zé)統(tǒng)一更新界面會使得應(yīng)用程序更加流暢,用戶體驗更好
多線程缺點
- 創(chuàng)建線程是有開銷的,iOS下主要成本包括:內(nèi)核數(shù)據(jù)結(jié)構(gòu)(大約1KB)、??臻g(子線程512KB、主線程1M、也可以使用-setStackSize:設(shè)置,但必須是4K的倍數(shù),而且最小是16K),創(chuàng)建線程大約需要90ms的創(chuàng)建時間
- 如果開啟大量的線程,會降低程序的性能
- 線程越多,CPU在調(diào)度線程上的開銷就越大
- 程序設(shè)計更加復(fù)雜:比如線程之間的通信、多線程的數(shù)據(jù)共享
多線程使用注意
- 共享資源的“爭奪”
- 多線程是為了同步完成多項任務(wù),不是為了提高運行效率,而是為了通過提高資源使用效率來提高系統(tǒng)的整體性能
- 線程使用不是無節(jié)制的
- iOS中的主線程的堆棧大小是1M
- 從第二個線程開始都是512KB
- 這些數(shù)值不能通過編譯器開關(guān)或線程API函數(shù)更改
- 只有主線程有直接修改UI的能力
iOS程序亂使用多線程出現(xiàn)的狀況
在iOS手機端表現(xiàn):手機發(fā)燙、電池消耗迅速
多線程在iOS開發(fā)中的應(yīng)用
做一個表格方便理解,一目了然
| 主線程 | 子線程 | |
|---|---|---|
| 概念 | 1個iOS程序運行后,默認會開啟一條線程,稱為“主線程”或“UI線程” | 由我們手動創(chuàng)建或者開啟的線程 |
| 作用 | 顯示、刷新UI界面,處理UI事件(比如點擊事件、滾動事件、拖拽事件等) | 處理耗時、輪詢或者并發(fā)需求高等的任務(wù) |
| 使用注意 | 1、別將比較耗時的操作放在主線程中。2、耗時操作會卡住主線程,嚴重影響UI的流暢度,給用戶一種'卡'的壞體驗 | 盡可能不要刷新UI,可能會崩潰 |
線程的創(chuàng)建
| 技術(shù)方案 | 簡介 | 語言 | 線程生命周期 | 使用頻率 |
|---|---|---|---|---|
| pthread | 1. 一套通用的多線程API 2. 適用于Unix\linux\Windows等系統(tǒng)。3. 跨平臺\可移植。4. 適用難度大 | C | 程序員管理 | 幾乎不用 |
| NSThread | 1. 適用更加面相對象。2. 簡單易用,可直接操作線程對象。 | OC | 程序員管理 | 偶爾使用 |
| GCD | 1. 旨在替代NSThread等線程技術(shù)。2. 充分利用設(shè)備的多核。 | C | 自動管理 | 經(jīng)常使用 |
| NSOperation | 1. 基于GCD(底層是GCD)。2. 比GCD多了一些更簡單使用的功能。2. 使用更加面向?qū)ο蟆?/td> | OC | 自動管理 | 經(jīng)常使用 |
蘋果推薦是用GCD 和 NSOperation
注意:
[NSThread currentThread]跟蹤任務(wù)所在線程,適用于NSThread、NSOperation、GCD
使用NSThread的線程,不會自動添加autoreleasepool
線程中的自動釋放池:
@autoreleasepool{}自動釋放池。主線程中是有自動釋放池,使用NSThread 和 NSObject 不會有。如果在后臺線程中創(chuàng)建了autoreleasepool的對象,需要使用自動釋放池,否則會出現(xiàn)內(nèi)存泄漏。當(dāng)自動釋放池銷毀時,對池中的所有對象發(fā)送release消息,清空自動釋放池。當(dāng)所有的autorelease對象,在出了作用域后,會自動添加到最近一次創(chuàng)建的自動釋放池中。
后續(xù)詳細介紹這四種方式