一 單線程概述
每個正在運行的程序(即進(jìn)程)至少包含一個線程,這個線程是主線程.
主線程在程序啟動時被創(chuàng)建,用于執(zhí)行main函數(shù).
只有一個主線程的程序被稱為單線程程序.主線程負(fù)責(zé)執(zhí)行程序所有的代碼(UI刷新,網(wǎng)絡(luò)請求,數(shù)據(jù)加載),這些代碼只能順序執(zhí)行,不能并發(fā)執(zhí)行.
二 多線程概述
擁有多個線程的程序被稱為多線程程序.
iOS允許用戶自己開辟線程,相對于主線程而言,這些線程被稱為子線程.
子線程與主線程都是獨立運行的單元,相互不影響,所以可以并發(fā)執(zhí)行.
三 單線程&多線程區(qū)別
單線程程序只有一個線程,所以代碼順序執(zhí)行,容易出現(xiàn)代碼阻塞(頁面假死)等狀態(tài).
多線程程序各個線程獨立執(zhí)行,能有效避免代碼阻塞,并提高程序運行性能.
注意:UI添加和刷新必須在主線程執(zhí)行.
在 iOS 中其實目前有 4 套多線程方案,他們分別是:
<pre>

</pre>
<pre>
Pthread
是這四套線程中最垃圾的一套方法,我們也可以直接忽略它,在我們開發(fā)中根本就遇不到。簡單地說,這是一套在很多操作系統(tǒng)上都通用的多線程API,所以移植性很強(然并卵),當(dāng)然在 iOS 中也是可以的。不過這是基于c語言的框架.NSThread
這套方案是經(jīng)過蘋果封裝后的,并且完全面向?qū)ο蟮?。所以你可以直接操控線程對象,非常直觀和方便。但是,它的生命周期還是需要我們手動管理,所以這套方案也是偶爾用用,比如 [NSThread currentThread],它可以獲取當(dāng)前線程類,你就可以知道當(dāng)前線程的各種屬性,用于調(diào)試十分方便。GCD
全稱是Grand Central Dispatch,實際在我們開發(fā)過程中用到多線程中用到最多的是GCD了,它是蘋果為多核的并行運算提出的解決方案,所以會自動合理地利用更多的CPU內(nèi)核(比如雙核、四核),最重要的是它會自動管理線程的生命周期(創(chuàng)建線程、調(diào)度任務(wù)、銷毀線程),完全不需要我們管理,我們只需要告訴干什么就行。同時它使用的也是 c語言,不過由于使用了 Block(Swift里叫做閉包),使得使用起來更加方便,而且靈活。NSOperation和NSOperationQueue
NSOperation 是蘋果公司對 GCD 的封裝,完全面向?qū)ο螅允褂闷饋砀美斫狻?大家可以看到 NSOperation 和 NSOperationQueue 分別對應(yīng) GCD 的 任務(wù) 和 隊列 。操作步驟也很好理解:
將要執(zhí)行的任務(wù)封裝到一個 NSOperation 對象中。
將此任務(wù)添加到一個 NSOperationQueue 對象中。
然后系統(tǒng)就會自動在執(zhí)行任務(wù)。至于同步還是異步、串行還是并行請繼續(xù)往下看:
</pre>
好處:
1、使用線程可以把程序中占據(jù)時間長的任務(wù)放到后臺去處理,如圖片、視頻的下載
2、發(fā)揮多核處理器的優(yōu)勢,并發(fā)執(zhí)行讓系統(tǒng)運行的更快、更流暢,用戶體驗更好
缺點:
1、大量的線程降低代碼的可讀性,
2、更多的線程需要更多的內(nèi)存空間
3、當(dāng)多個線程對同一個資源出現(xiàn)爭奪的時候要注意線程安全的問題。