基本概念
做一個(gè)表格方便理解相關(guān)的包含關(guān)系
進(jìn)程 | 線程 | 多線程 | |
---|---|---|---|
定義 | 進(jìn)程是指在系統(tǒng)中正在運(yùn)行的一個(gè)應(yīng)用程序延届。每個(gè)進(jìn)程之間是獨(dú)立的卒煞,每個(gè)進(jìn)程均運(yùn)行在其專用且受保護(hù)的內(nèi)存空間內(nèi) | 1個(gè)進(jìn)程要想執(zhí)行任務(wù)抖苦,必須得有線程(每1個(gè)進(jìn)程至少要有1條線程),1個(gè)進(jìn)程(程序)的所有任務(wù)都在線程中執(zhí)行 | 1個(gè)進(jìn)程中可以開啟多條線程毯侦,每條線程可以并行(同時(shí))執(zhí)行不同的任務(wù)洒缀。 |
例 | 我們同時(shí)打開迅雷瑰谜、QQ欺冀、系統(tǒng)就會(huì)分別啟動(dòng)2個(gè)進(jìn)程 | 酷狗播放音樂、使用迅雷下載電影萨脑,都需要在線程中執(zhí)行 | 進(jìn)程—>車間隐轩,線程—>車間工人 |
線程的串行(C語言環(huán)境下)
1個(gè)線程中的任務(wù)的執(zhí)行是串行的。如果要在一個(gè)線程中執(zhí)行多個(gè)任務(wù)渤早,那么只能一個(gè)一個(gè)地按順序執(zhí)行這些任務(wù)职车。也就是說,在同一時(shí)間內(nèi)鹊杖,1個(gè)線程只能執(zhí)行1個(gè)任務(wù)悴灵,具體串行并行同步異步會(huì)在之后的文章中解釋。骂蓖。积瞒。
比如在1個(gè)線程中下載3個(gè)文件(文件A、文件B登下、文件C)如果是串行執(zhí)行茫孔,因此,可以認(rèn)為線程是進(jìn)程中的 1條執(zhí)行路徑
多線程
多線程的原理
- 同一時(shí)間被芳,CPU只能處理1條線程缰贝,只有1條線程在工作(執(zhí)行)
- 多線程并發(fā)(同時(shí))執(zhí)行,其實(shí)是CPU快速地在多條線程之間調(diào)度(切換)
- 如果CPU調(diào)度線程的時(shí)間足夠快畔濒,就造成了多線程并發(fā)執(zhí)行的假象
多線程優(yōu)缺點(diǎn)
多線程優(yōu)點(diǎn)
- 能適當(dāng)提高程序的執(zhí)行效率
- 能適當(dāng)提高資源利用率(CPU剩晴、內(nèi)存利用率),充分發(fā)揮多核處理器優(yōu)勢侵状,將不同線程任務(wù)分配給不同的處理器赞弥,真正進(jìn)入“并行運(yùn)算”狀態(tài)
- 將耗時(shí)、輪詢或者并發(fā)需求高等任務(wù)分配到其他線程執(zhí)行壹将,并由主線程負(fù)責(zé)統(tǒng)一更新界面會(huì)使得應(yīng)用程序更加流暢嗤攻,用戶體驗(yàn)更好
多線程缺點(diǎn)
- 創(chuàng)建線程是有開銷的毛嫉,iOS下主要成本包括:內(nèi)核數(shù)據(jù)結(jié)構(gòu)(大約1KB)诽俯、棧空間(子線程512KB承粤、主線程1M暴区、也可以使用-setStackSize:設(shè)置,但必須是4K的倍數(shù)辛臊,而且最小是16K),創(chuàng)建線程大約需要90ms的創(chuàng)建時(shí)間
- 如果開啟大量的線程仙粱,會(huì)降低程序的性能
- 線程越多,CPU在調(diào)度線程上的開銷就越大
- 程序設(shè)計(jì)更加復(fù)雜:比如線程之間的通信彻舰、多線程的數(shù)據(jù)共享
多線程使用注意
- 共享資源的“爭奪”
- 多線程是為了同步完成多項(xiàng)任務(wù)伐割,不是為了提高運(yùn)行效率候味,而是為了通過提高資源使用效率來提高系統(tǒng)的整體性能
- 線程使用不是無節(jié)制的
- iOS中的主線程的堆棧大小是1M
- 從第二個(gè)線程開始都是512KB
- 這些數(shù)值不能通過編譯器開關(guān)或線程API函數(shù)更改
- 只有主線程有直接修改UI的能力
iOS程序亂使用多線程出現(xiàn)的狀況
在iOS手機(jī)端表現(xiàn):手機(jī)發(fā)燙、電池消耗迅速
多線程在iOS開發(fā)中的應(yīng)用
做一個(gè)表格方便理解隔心,一目了然
主線程 | 子線程 | |
---|---|---|
概念 | 1個(gè)iOS程序運(yùn)行后白群,默認(rèn)會(huì)開啟一條線程,稱為“主線程”或“UI線程” | 由我們手動(dòng)創(chuàng)建或者開啟的線程 |
作用 | 顯示硬霍、刷新UI界面帜慢,處理UI事件(比如點(diǎn)擊事件、滾動(dòng)事件唯卖、拖拽事件等) | 處理耗時(shí)粱玲、輪詢或者并發(fā)需求高等的任務(wù) |
使用注意 | 1、別將比較耗時(shí)的操作放在主線程中拜轨。2抽减、耗時(shí)操作會(huì)卡住主線程,嚴(yán)重影響UI的流暢度撩轰,給用戶一種'卡'的壞體驗(yàn) | 盡可能不要刷新UI胯甩,可能會(huì)崩潰 |
線程的創(chuàng)建
技術(shù)方案 | 簡介 | 語言 | 線程生命周期 | 使用頻率 |
---|---|---|---|---|
pthread | 1. 一套通用的多線程API 2. 適用于Unix\linux\Windows等系統(tǒng)。3. 跨平臺(tái)\可移植堪嫂。4. 適用難度大 | C | 程序員管理 | 幾乎不用 |
NSThread | 1. 適用更加面相對(duì)象偎箫。2. 簡單易用,可直接操作線程對(duì)象皆串。 | OC | 程序員管理 | 偶爾使用 |
GCD | 1. 旨在替代NSThread等線程技術(shù)淹办。2. 充分利用設(shè)備的多核。 | C | 自動(dòng)管理 | 經(jīng)常使用 |
NSOperation | 1. 基于GCD(底層是GCD)恶复。2. 比GCD多了一些更簡單使用的功能怜森。2. 使用更加面向?qū)ο蟆?/td> | OC | 自動(dòng)管理 | 經(jīng)常使用 |
蘋果推薦是用GCD 和 NSOperation
注意:
[NSThread currentThread]跟蹤任務(wù)所在線程,適用于NSThread谤牡、NSOperation副硅、GCD
使用NSThread的線程,不會(huì)自動(dòng)添加autoreleasepool
線程中的自動(dòng)釋放池:
@autoreleasepool{}自動(dòng)釋放池翅萤。主線程中是有自動(dòng)釋放池恐疲,使用NSThread 和 NSObject 不會(huì)有。如果在后臺(tái)線程中創(chuàng)建了autoreleasepool的對(duì)象套么,需要使用自動(dòng)釋放池培己,否則會(huì)出現(xiàn)內(nèi)存泄漏。當(dāng)自動(dòng)釋放池銷毀時(shí)胚泌,對(duì)池中的所有對(duì)象發(fā)送release消息省咨,清空自動(dòng)釋放池。當(dāng)所有的autorelease對(duì)象玷室,在出了作用域后零蓉,會(huì)自動(dòng)添加到最近一次創(chuàng)建的自動(dòng)釋放池中笤受。
后續(xù)詳細(xì)介紹這四種方式