1.基本概念
進程:操作系統上每一個可以執行的程序。
線程:進程中的任務,必須在線程中執行。
每一個進程,至少包含一個線程,就是我們常說的主線程。
2.任務在線程中的執行
任務在線程中一次一個的依次執行。一個線程同時只能執行一個任務。
如果我們需要同時執行多個任務,就需要多個線程,每次執行一個任務。
為了提高用戶體驗,我們就需要使用多線程,比如:網絡請求,下載圖片。
3.線程操作的三種方式
(1)NSThread
輕量級的線程操作,需要我們自己創建線程,調度任務,銷毀線程
① 后台線程:performSelectorInBackground
② 主線程;performSelectorOnMainThread
③ 以上兩個線程,只要繼承自NSObject的對象,都可以調用
④ 手動開辟一個分線程:NSThread * thread = [NSThread alloc] initWithTarget:<#(id)#> selector:<#(SEL)#> object:<#(id)#>
[thread start];
⑤ 自動開辟分線程:[NSThread detachNewThreadSelector:<#(SEL)#> toTarget:<#(id)#> withObject:<#(id)#>]
⑥ 判斷線程是否為主線程:[NSThread isMainThread]
⑦ 線程休眠:[NSThread sleepForTimeInterval:2]
⑧ 查看當前線程:[NSThread currentThread]
(2)GCD
Grand Central Dispatch的縮寫 宏大的的中央調度 基於C語言
<1>GCD存在於libdispatch.dylib這個庫中,這個調度庫包含了GCD的所有的東西,但任何IOS程序,默認就加載了這個庫,在程序運行的過程中會動態的加載這個庫,不需要我們手動導入。
<2>GCD中的函數大多數都以dispatch開頭。
GCD的優勢:
1.他是蘋果公司為多核的並行運算提出的解決方案;
2.它在工作的時候會自動利用更多的處理器核心;
3.不用關心線程代碼的實現, 即不需要關心什么時候開起線程, 關閉線程. GCD會負責創建線程調度你的任務;
4.只需要創建出來你要執行的任務, 然后把任務添加到適當的隊列中.
dispatch queue (調度隊列)
核心理念: 將長期運行的任務拆分成多個工作單元, 並把這些工作單元添加調度隊列
(意思就是將任務添加到隊列當中)
串行和並行隊列
串行隊列,添加到隊列中的任務按照添加順序依次執行。FIFO,先進先出。
並行隊列,多個任務同時執行,需要多條分線程。
同步與異步
同步:前一個任務不執行完,后邊的任務等待前一個任務執行完,再執行
異步:不管前一個任務是否執行完畢,后一個任務都直接執行
總結:
1.同步異步決定了是否會開啟分線程.
2.串行並行決定了任務在線程中是一次只執行一個任務還是並發執行多個任務.
3.並行隊列只有在異步函數下才有效
GCD 使用隊列(queue)管理線程,隊列分為三種
1.自定義的串行和並行隊列。
2.運行在分線程的四個優先級不同全局並行隊列,globalQueue。
3.運行在主線程的串行隊列,mianQueue。(在主線程中,主隊列中使用同步任務會造成死鎖)
在一組並行任務執行完畢后做某個操作,使用dispatch_group
鎖
多個線程對同一個變量的修改需要加鎖。保證一個變量同時只能被一個線程修改,當這個線程修改完畢后,其他線程才能修改。可以使用:NSLock,@synchronized。
單例模式:是一個類在系統中只有一個實例對象,通過全局的一個入口點對這個實例對象進行訪問.
iOS中單例模式的實現方法有兩種:非ARC和ARC + GCD;
(3)NSOperation
純OC代碼 操作隊列,對GCD的封裝.它是一個抽象類,只能使用其子類對象。系統提供了兩個子類對象,分別是 NSInvocationOperation 和 NSBlockOperation。通常我們自定義 NSOperation 的子類,重寫子類的 main 方法,把需要在分線程執行的任務放在 main 方法里。然后把 NSOperation 對象添加到 NSOperationQueue 中,就會自動在分線程執行 main 方法。
4.GCD 和 NSOperation 進行比較。
(1).NSOperation 是對 GCD 的封裝,面相對象的類,GCD 只是一組方法 API。
(2).NSOperation 可以實現一些 GCD 中實現不了,或者實現比較復雜的功能。比如:設置最大並發數,設置線程間的依賴關系。
(3).實現某個多線程功能,使用 GCD,簡單易用。實現某個多線程模塊,使用 NSOperation,方便類的管理。
5.nonatomic,atomic
nonatomic,非原子性,多線程訪問修改不加鎖。
atomic,原子性,多線程訪問加鎖。
iOS 推薦我們使用 nonatomic,移動端的開發沒有復雜的多線程場景,不加鎖解鎖可以提高效率。
系統的可變對象,NSMutableArray,NSMutabelString 都是線程不安全的,多線程修改,需要加鎖。