首先呢 和大家分享一下關(guān)于線程和進(jìn)程一些方面的知識(shí)概念哈
進(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)(例如: 同時(shí)打開qq和微信 系統(tǒng)就會(huì)分別啟動(dòng)兩個(gè)進(jìn)程)
線程: 1個(gè)進(jìn)程執(zhí)行任務(wù)必須有線程(每個(gè)進(jìn)程中必須至少有一個(gè)線程) 線程是進(jìn)程執(zhí)行的最基本單元 一個(gè)進(jìn)程中的所有任務(wù)都在線程中執(zhí)行(例如: 用在愛奇藝上看電影 下載電影)
線程的串行: 一個(gè)線程中任務(wù)的執(zhí)行時(shí)串行的 如果在一個(gè)線程中執(zhí)行多個(gè)任務(wù) 那么只能按照順序一個(gè)一個(gè)執(zhí)行
多線程: 在一個(gè)進(jìn)程中 可以開辟多個(gè)線程來執(zhí)行任務(wù) 每條線程可以并行同時(shí)執(zhí)行不同任務(wù) 多線程技術(shù)可以提高程序的執(zhí)行效率 例如 同時(shí)下載三首音樂
多線程的原理: 在一個(gè)進(jìn)程中 實(shí)際上CPU只能執(zhí)行一個(gè)線程中的任務(wù) 多線程并發(fā)執(zhí)行之際上是 CPU快速的在多線程之間進(jìn)行切換調(diào)度 如果CPU的調(diào)度速度足夠快 就造成了多線程并發(fā)執(zhí)行的假象
但是一定記住 不可以創(chuàng)建過多的子線程 這樣CPU在切換線程并上的開銷會(huì)很大 CPU會(huì)累死 消耗大量的CPU資源 平均下來 每條線程被調(diào)度執(zhí)行的頻次會(huì)降低(線程的執(zhí)行效率也就降低了)
多線程的優(yōu)缺點(diǎn):
優(yōu)點(diǎn):
能適當(dāng)?shù)奶岣叱绦虻膱?zhí)行效率 能適當(dāng)提高資源利用率(CPU 內(nèi)存利用率(只要開啟線程就會(huì)占用一部分內(nèi)存資源))
缺點(diǎn):
開啟線程要占用一定的系統(tǒng)資源(默認(rèn)情況下 主線程占1M 子線程棧512KB)
程序變得更加復(fù)雜 比如線程之間的通信 多線程的數(shù)據(jù)共享
多線程在iOS中的應(yīng)用:
主線程: 一個(gè)iOS程序運(yùn)行后默認(rèn)會(huì)開啟一個(gè)主線程(UI線程)
主線程的主要作用: 顯示/刷新UI界面 處理UI事件(點(diǎn)擊事件, 滾動(dòng)事件, 拖拽事件等)
注意不要將耗時(shí)的操作放到主線程 會(huì)嚴(yán)重的影響到UI的流暢度 給用戶一種卡頓的體驗(yàn)
在iOS編程中有三種多線程編程技術(shù)分別是:
- NSThread
- Cocoa NSOperation
- GCD (Grand Central Dispatch)
以上三種多線程編程 從上到下 抽象層次是從低到高 抽象度越高使用起來越簡(jiǎn)單 也是Apple最推薦使用的
下面簡(jiǎn)單介紹一下以上三種多線程編程的優(yōu)缺點(diǎn)
NSThread
優(yōu)點(diǎn): 與其他兩種相比 較為輕量級(jí)
缺點(diǎn): 需要自己管理線程的生命周期, 線程同步
Cocoa NSOperation
優(yōu)點(diǎn): 不需要線程的管理 數(shù)據(jù)同步的事情 可以把精力放在自己需要執(zhí)行的操作上 相關(guān)的類是NSOperation NSOperationQueue
NSOperation是個(gè)抽象類 使用它必須用他的子類 可是實(shí)現(xiàn)它或者使用它定義好的兩個(gè)子類 NSInvocationOperation和NSBlockOperation 創(chuàng)建NSOperation子類的對(duì)象 把對(duì)象添加到NSOperationQueue隊(duì)列里執(zhí)行
GCD
Grand Central Dispatch 是Apple開發(fā)的一個(gè)多核編程的解決方法 在iOS4.0以后開始使用 GCD是一個(gè)代替NSTread和NSOperation等技術(shù)的很高效很強(qiáng)大的技術(shù)