iOS 多線程總結

一、基本概念

1、進程

進程是指在系統中正在運行的一個應用程序
每個進程之間是相互獨立的, 每個進程均運行在其專用且受保護的內存空間內(可以在 Mac 的活動指示器查看當前系統內運行的進程)

2、線程

一個進程要想執行任務,必須要有線程,至少有一條線程
一個進程的所有任務都是在線程中執行

3、進程和線程的比較

  • 線程是 CPU 調用的最小單位
  • 進程是 CPU 分配資源和調度的單位
  • 一個程序可以對應多個進程,一個進程中可有多個線程,但至少要有一條線程
  • 同一個進程內的線程共享進程資源

4、多線程

一個進程可以開啟多條線程,每條線程可以并行執行不同的任務. 這個技術可以提高程序的執行效率

4.1、多線程原理

同一時間,CPU 只能處理一條線程, 只有一條線程在工作;
多線程并發執行,其實是 CPU 快速的在多條線程之間調度(切換);
如果 CPU 調度線程的時間足夠快, 就造成了多線程并發執行的假象。

4.2、多線程的優點和缺點

優點

  • 能適當的提高程序的執行效率
  • 能適當提高資源利用率(CPU 內存利用率)

缺點

  • 創建多線程是有開銷的,iOS 下主要成本包括: 內核數據結構,(大約1KB), 棧空間(子線程512KB, 主線程1MB, 也可以使用 -setStackSize: 設置, 但必須是4K 的倍數, 而且最小是16K), 創建線程大約需要90毫秒的創建時間
  • 如果開啟大量線程, 會降低程序的性能
  • 線程越多,CPU 在調度線程上的開銷就越大
  • 程序設計更加復雜: 比如線程之間的通信, 多線程的數據共享

二、iOS開發中實現多線程的方式

pthread: 跨平臺,適用于多種操作系統,可移植性強,是一套純C語言的通用API,且線程的生命周期需要程序員自己管理,使用難度較大,所以在實際開發中通常不使用。

NSThread: 基于OC語言的API,是輕量級的,使得其簡單易用,面向對象操作。線程的生命周期由程序員管理,在實際開發中偶爾使用。通過@selector指定要執行的方法,代碼分散。

GCD: 基于C語言的API,充分利用設備的多核,旨在替換NSThread等線程技術。線程的生命周期由系統自動管理,在實際開發中經常使用。通過Block指定要執行的方法,代碼集中利用閱讀和維護。

NSOperation: 基于OC語言API,底層是GCD,增加了一些更加簡單易用的功能,使用更加面向對象。線程生命周期由系統自動管理,在實際開發中經常使用。

三、GCD與NSOperation 的區別

1.GCD的核心是C語言寫的系統服務,執行和操作簡單高效,因此NSOperation底層也通過GCD實現,換個說法就是NSOperation是對GCD更高層次的抽象,這是他們之間最本質的區別.因此如果希望自定義任務,建議使用NSOperation;

2.依賴關系,NSOperation可以設置兩個NSOperation之間的依賴,第二個任務依賴于第一個任務完成執行,GCD無法設置依賴關系,不過可以通過dispatch_barrier_async來實現這種效果;

3.KVO(鍵值對觀察),NSOperation和容易判斷Operation當前的狀態(是否執行,是否取消),對此GCD無法通過KVO進行判斷;

4.優先級,NSOperation可以設置自身的優先級,但是優先級高的不一定先執行,GCD只能設置隊列的優先級,無法在執行的block設置優先級;

5.繼承,NSOperation是一個抽象類實際開發中常用的兩個類是NSInvocationOperation和NSBlockOperation,同樣我們可以自定義NSOperation,GCD執行任務可以自由組裝,沒有繼承那么高的代碼復用度;

6.效率,直接使用GCD效率確實會更高效,NSOperation會多一點開銷,但是通過NSOperation可以獲得依賴,優先級,繼承,鍵值對觀察這些優勢,相對于多的那么一點開銷確實很劃算,魚和熊掌不可得兼,取舍在于開發者自己;

四、多線程的實現

1、iOS 多線程實現-NSThread

2、iOS 多線程實現-GCD

3、iOS 多線程實現-NSOperation

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 進程 什么是進程 進程是指在系統中正在運行的一個應用程序 每個進程之間是獨立的,每個進程均運行在其專用且受保護的內...
    45b645c5912e閱讀 475評論 0 5
  • 目錄 簡述 NSThread GCD操作與隊列異步操作并行隊列同步操作并行隊列同步操作串行隊列異步操作串行隊列隊列...
    魚王00閱讀 512評論 0 2
  • Object C中創建線程的方法是什么?如果在主線程中執行代碼,方法是什么?如果想延時執行代碼、方法又是什么? 1...
    AlanGe閱讀 1,777評論 0 17
  • 多線程 在iOS開發中為提高程序的運行效率會將比較耗時的操作放在子線程中執行,iOS系統進程默認啟動一個主線程,用...
    郭豪豪閱讀 2,612評論 0 4
  • 9.17(Day17) 通過昨天一整天的休息,今天明顯感覺精神狀態好了很多,因明天是工作日,所以還是去了醫院看醫...
    carmenL閱讀 129評論 0 0