1. 程式人生 > >多執行緒理解和我們為什麼要使用執行緒

多執行緒理解和我們為什麼要使用執行緒

首先說下多執行緒出現的原因:

為了解決負載均衡問題,充分利用CPU資源.為了提高CPU的使用率,採用多執行緒的方式去同時完成幾件事情而不互相干擾.為了處理大量的IO操作時或處理的情況需要花費大量的時間等等,比如:讀寫檔案,視訊影象的採集,處理,顯示,儲存等

多執行緒的好處:

1.使用執行緒可以把佔據時間長的程式中的任務放到後臺去處理

2.使用者介面更加吸引人,這樣比如使用者點選了一個按鈕去觸發某件事件的處理,可以彈出一個進度條來顯示處理的進度

3.程式的執行效率可能會提高

4.在一些等待的任務實現上如使用者輸入,檔案讀取和網路收發資料等,執行緒就比較有用了.

多執行緒的缺點:

1.如果有大量的執行緒,會影響效能,因為作業系統需要在它們之間切換.

2.更多的執行緒需要更多的記憶體空間

3.執行緒中止需要考慮對程式執行的影響.

4.通常塊模型資料是在多個執行緒間共享的,需要防止執行緒死鎖情況的發生

實現多執行緒的方法:

1.NSObject

2.NSthread

3.NSOperation

4.GCD

iOS中多執行緒的方法主要有三種:

1.NSThread   2.NSOperation  3.GCD

(1)NSOperation與GCD的區別:

Mac OS X 10.6及iOS4.0之後匯入了可以使全體執行緒更高效執行,並且使並行處理應用更易開發的架構,GCD(Grand Central  Dispatch),同時引入的還有Run Loop,執行緒(包括Cocoa和POSIX)和 Operation。GCD擁有非常輕量級的工作單元和併發方式,並且由系統決定其最佳排程方式。這個時候出現了一個問題,NSOperation如何處理呢?

其實我們在通過NSOperation和GCD進行開發過程中,會發現兩者執行的方式有許多相似之處,NSOperation和GCD參照對比,NSOperationQueue和dispatch_queue參照對比,但是兩者之間還是有許多差別的,具體區別:

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可以獲得依賴,優先順序,繼承,鍵值對觀察這些優勢,相對於多的那麼一點開銷確實很划算,魚和熊掌不可得兼,取捨在於開發者自己;

關於主要的區別都已經總結,根據實際開發中來說,GCD使用情況較多,簡單高效,從變成原則上來看,應該是使用高層次的抽象,避免使用低層次的抽象,那麼無疑我們應該選擇NSOperation,因為複雜的任務可以自己通過NSOperation實現,日常還是GCD的天下,畢竟GCD有更高的併發和執行能力

(2)GCD與NSThread的區別:

1)NSThread通過@selector指定要執行的方法,程式碼分散

2)GCD通過Block指定要執行的程式碼,程式碼集中,所有的程式碼寫在一起的,讓程式碼更加簡單,易於閱讀和維護

3)使用GCD不需要管理執行緒的建立/銷燬/複用的過程!程式設計師不用關心執行緒的生命週期

4)如果要開多個執行緒NSThead 必須例項化多個執行緒物件

5)NSThread靠NSObject的分類方法實現的執行緒間通訊