iOS多線程開發(fā)

在iOS開發(fā)過程中還是在面試的時(shí)候,多線程問題是不可避免的。開發(fā)過程中,使用多線程可以提高性能,用戶體驗(yàn)更好,這是在你會(huì)用,而且用好的的情況下才能達(dá)到相應(yīng)的效果,否則就會(huì)出現(xiàn)相反的結(jié)果;在面試中,經(jīng)常問到,什么是進(jìn)程,什么是線程,他們之間的區(qū)別,開辟線程有幾種方法,優(yōu)缺點(diǎn),線程之間是怎么通信的等等,問的一頭霧水,接下來我給大家把這些問題一一解答,看完之后你會(huì)覺得,麻麻再也不用擔(dān)心我的面試?yán)玻?br>

1.進(jìn)程

進(jìn)程是指在系統(tǒng)中正在運(yùn)行的一個(gè)應(yīng)用程序(或開辟的一塊空間),進(jìn)程是不做任務(wù)的,只有開辟了線程才能做任務(wù)的;

例如:我們電腦同時(shí)打開網(wǎng)易云音樂和Xcode,那么系統(tǒng)就會(huì)分別啟動(dòng)兩個(gè)進(jìn)程;

2.線程

一個(gè)進(jìn)程要想執(zhí)行任務(wù),必須要有進(jìn)程(每1個(gè)進(jìn)程至少要有1個(gè) 線程);

線程是進(jìn)程的基本執(zhí)行單元,一個(gè)進(jìn)程的所有任務(wù)都在線程中執(zhí)行;

線程和進(jìn)程的聯(lián)系如下圖:

3.線程的串行

一個(gè)線程中任務(wù)的執(zhí)行是串行的,如果一個(gè)線程要執(zhí)行多個(gè)任務(wù),那么這些任務(wù)只能以一個(gè)一個(gè)地按順序執(zhí)行這些任務(wù);

4.主線程

一個(gè)iOS程序運(yùn)行后,默認(rèn)會(huì)開啟一條線程,成為主線程,或UI線程;

作用:

顯示\刷新UI界面;

處理UI事件(例點(diǎn)擊事件、滾動(dòng)事件、拖拽事件等);

注意:

不要將比較耗時(shí)的操作放到主線程中(例:下載1G的視頻,這個(gè)時(shí)候卡主界面);

耗時(shí)操作會(huì)卡住主線程,嚴(yán)重影響UI的流暢度,給用戶一種“卡”的壞體驗(yàn);

解決耗時(shí)操作:在非主線程(子線程)執(zhí)行耗時(shí)操作;

5.多線程

概念:

一個(gè)進(jìn)程可以開啟多條線程,每條線程可以并行執(zhí)行不同的任務(wù),多線程技術(shù)可以提高程序的執(zhí)行效率;

注:并行執(zhí)行:是指可以同時(shí)執(zhí)行,比如任務(wù)A和任務(wù)B,在執(zhí)行的時(shí)候A和B同時(shí)執(zhí)行;

原理:

同一時(shí)間,CPU只能處理一條線程,只有一條線程在工作(執(zhí)行);

多線程并發(fā)執(zhí)行,其實(shí)是CPU快速地在多條線程之間調(diào)度(切換);

如果CUP調(diào)度線程的時(shí)間足夠快,就造成了多線程并發(fā)執(zhí)行的假象;

注意:如果CPU開辟N條線程,會(huì)怎樣呢?

CPU會(huì)在N多線程之間調(diào)度,CPU會(huì)累死,消耗大量的CPU資源,建議最多5條;

每條線程被跳讀執(zhí)行的頻次會(huì)減低,反而降低了執(zhí)行效率;

多線程的優(yōu)點(diǎn):

能適當(dāng)提高程序的執(zhí)行效率;

能適當(dāng)提高資源利用率(CPU,內(nèi)存利用率);

多線程的缺點(diǎn):

開啟線程需要占用一定的內(nèi)存空間(默認(rèn)情況下,主線程占用1M,子線程占用512KB),如果開啟大量的線程,會(huì)占用大量的內(nèi)存空間,降低程序的性能 ;

線程越多,CPU在調(diào)度想成上的開銷就越大;

程序設(shè)計(jì)更加復(fù)雜:比如線程之間的通信、多線程的數(shù)據(jù)共享;

6.實(shí)現(xiàn)多線程的方案

pthread:一套通用的多線程API,適用于Unix\Linux等系統(tǒng),跨平臺(tái),可移植,使用難度大,是純C語言,生命周期需要程序員管理,幾乎不用;

NSTread: 使用更加面向?qū)ο?,簡單易用,可直接操作線程對象,OC語言,程序員管理線程生命的周期,偶爾使用;

GCD:旨在替換NSThread等線程技術(shù),充分利用設(shè)備的多核,C語言,自動(dòng)管理線程的生命周期,經(jīng)常使用;

NSOperation:基于GCD(底層是GCD),比GCD多了一些更簡單的使用功能,使用更加面向?qū)ο?,OC語言,自動(dòng)管理線程的生命周期,經(jīng)常使用;

7.多線程安全隱患

一塊資源可能會(huì)被多個(gè)線程共享,也就是多個(gè)線程可能會(huì)訪問同一塊資源;

當(dāng)多個(gè)線程訪問同一塊資源時(shí),很容易引發(fā)數(shù)據(jù)錯(cuò)亂和數(shù)據(jù)安全問題;

8.安全隱患解決方法

互斥鎖@synchornized(鎖對象){需要鎖定的代碼}

注意:鎖定一份代碼只用一把鎖,用多把鎖是無效的;

互斥鎖的優(yōu)缺點(diǎn):

優(yōu)點(diǎn):能有效防止因多線程搶奪資源造成的數(shù)據(jù)安全問題;

缺點(diǎn):需要消耗大量的CPU資源;

互斥鎖使用條件:多條線程搶奪同一塊資源;

線程同步:多條線程在同一條線上執(zhí)行(按順序地執(zhí)行任務(wù));

互斥鎖就是達(dá)到了線程同步技術(shù);

在這里補(bǔ)充一下,nonatomic和atomic對比,atomic線程安全,需要消耗大量的資源,nonatomic非線程安全,適合內(nèi)存小的移動(dòng)設(shè)備;iOS開發(fā)建議,所有屬性聲明為nonatomic,盡量避免多線程請多同一塊資源,盡量將加鎖、資源搶奪的業(yè)務(wù)邏輯交給服務(wù)器端處理,減小移動(dòng)客戶端的壓力;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • GCD是什么? 作為一個(gè)iOS開發(fā)者,無論你是大神還是像我這樣的菜鳥,每一個(gè)人應(yīng)該都不會(huì)對多線程開發(fā)陌生,即便你沒...
    旅行的光閱讀 519評論 0 4
  • 一、NSThread 1、創(chuàng)建和啟動(dòng)線程 2、其他創(chuàng)建線程方式 上述2種創(chuàng)建線程方式的優(yōu)缺點(diǎn)優(yōu)點(diǎn):簡單快捷缺點(diǎn):無...
    小輝輝___閱讀 692評論 0 18
  • 文章轉(zhuǎn)載自~CSDN 作者:AirZilong的博客 1.進(jìn)程 進(jìn)程是指在系統(tǒng)中正在運(yùn)行的一個(gè)應(yīng)用程序(或開辟的一...
    每天刷兩次牙閱讀 186評論 0 0
  • Object C中創(chuàng)建線程的方法是什么?如果在主線程中執(zhí)行代碼,方法是什么?如果想延時(shí)執(zhí)行代碼、方法又是什么? 1...
    AlanGe閱讀 1,913評論 0 17
  • 甲:天亮了嗎? 乙:黑夜才剛剛開始。 甲:天亮了嗎? 乙:還有很長時(shí)間的。 甲:天亮了嗎? 乙:可能就快亮了。 甲...
    寒生默默閱讀 416評論 1 2

友情鏈接更多精彩內(nèi)容