輕量級的線程操作,需要我們自己創建線程,調度任務,銷毀線程
① 後臺線程: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 都是線程不安全的,多線程修改,需要加鎖。