多線程的種類:
第一種:pthread.
特點(diǎn):1)一套通用的多線程API2)適用于Unix\Linux\Windows等系統(tǒng)3)跨平臺\可移植4)使用難度大b.使用語言:c語言c.使用頻率:幾乎不用d.線程生命周期:由程序員進(jìn)行管理
第二種:NSThread
a.特點(diǎn):1)使用更加面向?qū)ο?)簡單易用,可直接操作線程對象b.使用語言:OC語言c.使用頻率:偶爾使用d.線程生命周期:由程序員進(jìn)行管理
第三種:GCD
a.特點(diǎn):1)旨在替代NSThread等線程技術(shù)2)充分利用設(shè)備的多核(自動)b.使用語言:C語言c.使用頻率:經(jīng)常使用d.線程生命周期:自動管理
第四種:NSOperation
a.特點(diǎn):1)基于GCD(底層是GCD)2)比GCD多了一些更簡單實(shí)用的功能3)使用更加面向?qū)ο?b.使用語言:OC語言c.使用頻率:經(jīng)常使用d.線程生命周期:自動管理
多線程的原理
同一時間,CPU只能處理1條線程,只有1條線程在工作(執(zhí)行)多線程并發(fā)(同時)執(zhí)行,其實(shí)是CPU快速地在多條線程之間調(diào)度(切換)如果CPU調(diào)度線程的時間足夠快,就造成了多線程并發(fā)執(zhí)行的假象思考:如果線程非常非常多,會發(fā)生什么情況? CPU會在N多線程之間調(diào)度,CPU會累死,消耗大量的CPU資源每條線程被調(diào)度執(zhí)行的頻次會降低(線程的執(zhí)行效率降低)

多線程的優(yōu)點(diǎn)
能適當(dāng)提高程序的執(zhí)行效率能適當(dāng)提高資源利用率(CPU、內(nèi)存利用率)
多線程的缺點(diǎn)
開啟線程需要占用一定的內(nèi)存空間(默認(rèn)情況下,主線程占用1M,子線程占用512KB),如果開啟大量的線程,會占用大量的內(nèi)存空間,降低程序的性能線程越多,CPU在調(diào)度線程上的開銷就越大程序設(shè)計更加復(fù)雜:比如線程之間的通信、多線程的數(shù)據(jù)共享
GCD與NSOperationQueue比較
傾向于GCD:
GCD 技術(shù)是一個輕量的,底層實(shí)現(xiàn)隱藏的神奇技術(shù),我們能夠通過GCD和block輕松實(shí)現(xiàn)多線程編程,有時候,GCD相比其他系統(tǒng)提供的多線程方法更加有效,當(dāng)然,有時候GCD不是最佳選擇,另一個多線程編程的技術(shù) NSOprationQueue 讓我們能夠?qū)⒑笈_線程以隊(duì)列方式依序執(zhí)行,并提供更多操作的入口,這和 GCD 的實(shí)現(xiàn)有些類似。 這種類似不是一個巧合,在早期,MacOX 與 iOS 的程序都普遍采用Operation Queue來進(jìn)行編寫后臺線程代碼,而之后出現(xiàn)的GCD技術(shù)大體是依照前者的原則來實(shí)現(xiàn)的,而隨著GCD的普及,在iOS 4 與 MacOS X 10.6以后,Operation Queue的底層實(shí)現(xiàn)都是用GCD來實(shí)現(xiàn)的。
1.? ? GCD是底層的C語言構(gòu)成的API,而NSOperationQueue及相關(guān)對象是Objc的對象。在GCD中,在隊(duì)列中執(zhí)行的是由block構(gòu)成的任務(wù),這是一個輕量級的數(shù)據(jù)結(jié)構(gòu);而Operation作為一個對象,為我們提供了更多的選擇;? ?
?2.? ? 在NSOperationQueue中,我們可以隨時取消已經(jīng)設(shè)定要準(zhǔn)備執(zhí)行的任務(wù)(當(dāng)然,已經(jīng)開始的任務(wù)就無法阻止了),而GCD沒法停止已經(jīng)加入queue的block(其實(shí)是有的,但需要許多復(fù)雜的代碼);? ?
?3.? ? NSOperation能夠方便地設(shè)置依賴關(guān)系,我們可以讓一個Operation依賴于另一個Operation,這樣的話盡管兩個Operation處于同一個并行隊(duì)列中,但前者會直到后者執(zhí)行完畢后再執(zhí)行;? ?
?4.? ? 我們能將KVO應(yīng)用在NSOperation中,可以監(jiān)聽一個Operation是否完成或取消,這樣子能比GCD更加有效地掌控我們執(zhí)行的后臺任務(wù);? ?
?5.? ? 在NSOperation中,我們能夠設(shè)置NSOperation的priority優(yōu)先級,能夠使同一個并行隊(duì)列中的任務(wù)區(qū)分先后地執(zhí)行,而在GCD中,我們只能區(qū)分不同任務(wù)隊(duì)列的優(yōu)先級,如果要區(qū)分block任務(wù)的優(yōu)先級,也需要大量的復(fù)雜代碼;? ?
?6.? ? 我們能夠?qū)SOperation進(jìn)行繼承,在這之上添加成員變量與成員方法,提高整個代碼的復(fù)用度,這比簡單地將block任務(wù)排入執(zhí)行隊(duì)列更有自由度,能夠在其之上添加更多自定制的功能。
總的來說,Operation queue 提供了更多你在編寫多線程程序時需要的功能,并隱藏了許多線程調(diào)度,線程取消與線程優(yōu)先級的復(fù)雜代碼,為我們提供簡單的API入口。從編程原則來說,一般我們需要盡可能的使用高等級、封裝完美的API,在必須時才使用底層API。但是我認(rèn)為當(dāng)我們的需求能夠以更簡單的底層代碼完成的時候,簡潔的GCD或許是個更好的選擇,而Operation queue 為我們提供能更多的選擇。
傾向于:NSOperation
1,NSOperation擁有更多的函數(shù)可用,具體查看api。NSOperationQueue 是在GCD基礎(chǔ)上實(shí)現(xiàn)的,只不過是GCD更高一層的抽象。
2,在NSOperationQueue中,可以建立各個NSOperation之間的依賴關(guān)系。
3,NSOperationQueue支持KVO??梢员O(jiān)測operation是否正在執(zhí)行(isExecuted)、是否結(jié)束(isFinished),是否取消(isCanceld)
4,GCD 只支持FIFO 的隊(duì)列,而NSOperationQueue可以調(diào)整隊(duì)列的執(zhí)行順序(通過調(diào)整權(quán)重)。NSOperationQueue可以方便的管理并發(fā)、NSOperation之間的優(yōu)先級。使用NSOperation的情況:各個操作之間有依賴關(guān)系、操作需要取消暫停、并發(fā)管理、控制操作之間優(yōu)先級,限制同時能執(zhí)行的線程數(shù)量.讓線程在某時刻停止/繼續(xù)等。使用GCD的情況:一般的需求很簡單的多線程操作,用GCD都可以了,簡單高效。從編程原則來說,一般我們需要盡可能的使用高等級、封裝完美的API,在必須時才使用底層API。當(dāng)需求簡單,簡潔的GCD或許是個更好的選擇,而Operation queue 為我們提供能更多的選擇。