IOS中多線程的總結


      首先要知道線程和進程的區別。一個系統上運行的每一個應用程序都是一個線程。而進程中要執行的任務都是在線程上來實現的,所以說線程是進程的最小執行單元。

      進程最少要有一個線程。多線程,顧名思義就是多條線程。

      那么在ios開發中運用到的多線程都有哪些呢,都有什么區別的,下面我們就來詳細的吐槽一波。

      說到多線程不得不提到POSix threads,簡稱PThreads。他是類Unix操作系統中管理線程的一套完整的API。具體的PThreads自己問一下性感迷人的度娘娘嘞!而Ios開發中我們碰到的線程管理具體的有3類,分別是:NSThreadNSOperation(NSOperationQueue)and GCD

一、NSThread

      NSthread我們在開發中用的最多的就是用【NSThread  CurrentThread】來獲取當前的線程。他在執行一些比較簡單的單任務的時候還是比較好用的,但是當要執行多個任務,並且任務之間還存在一定的關聯,有執行先后順序,這時候NSThread就顯得太薄弱了。

二、GCD

      開發過程中我們用的最多的就是GCD了吧。他是基於C語言的一套多線程開發的API。使用起來很方便,我們不用管理線程的生命周期,只需要關注我們執行的任務以及任務之間的關聯就可以了,GCD幫我們管理線程的生命周期。GCD歸納起來就是 隊列 + 執行方式。也就是說我們需要把執行的任務放到隊列中,然后以何種方式執行即可。

      至於隊列,GCD為我們提供了兩種隊列:串行隊列和並行隊列,這里需要提到的是程序中已經存在的兩個特殊的隊列,他們分別是主隊列(程序為我們創建的一個串行隊列)和全局隊列(程序為我們創建的一個並行隊列)

      串行隊列:串行隊列,就是說在這個隊列上的任務必須是一個接一個執行的,必須等待前面的一個任務執行完畢才可以繼續執行下面的任務。而且串行隊列不具備開啟新線程的能力。

      並行隊列:並行隊列,就是說在這個隊列上的任務不用等前面的任務執行完畢就可以執行其他的任務,他是等待任務執行的時候並發執行多個任務。而且並行隊列具備開啟新線程的能力,但是他不一定一定開啟一個新的線程來執行任務,主要還是看CPU的調度。

      同步執行:必須等dispatch_sync() 函數中的blcok執行完畢才返回該函數,同時同步執行也不能開辟新的線程。

      異步執行:dispatch_async() 函數立刻返回,不用等里面的block執行完畢,可以理解為在下一個執行周期執行block中的任務。異步執行可以開啟新的線程,但是不一定一定開啟新的線程。

      下面說一下隊列和執行方式的幾種組合方式。

      1.串行隊列 + 同步執行(這里的串行隊列不能是主隊列,因為會死鎖)

 

      我們可以看到任務是按順序執行的。

      2.串行隊列 + 異步執行

      我們可以看到異步執行的時候dispatch_async() 函數並沒用等block執行完畢就繼續執行下面的任務了。在下一個執行周期的時候執行了block中的任務。

      3.並行隊列 + 同步執行

        

      任務仍然是按順序執行的。同步執行必須等block中的任務執行完畢才返回dispatch函數,然后才執行下面的任務

      4.並行隊列 + 異步執行

        

      任務沒有按順序執行。

      GCD其他方面的功能       

      1. dispatch_after

      這個函數是用來延時執行任務用的

      可以看出在主隊列中延時執行,那么任務是在主線程中執行的。如果在全局隊列上延時執行,那么任務是在子線程中執行的。如果是在自定義的隊列上執行,那么任務也是在子線程上執行的。

      2. dispatch_once

      這個函數就是只執行一次,在程序中用的最多的估計就是創建單例類的時候吧。

        

      我們可以看到程序調用了3次,但是dispatch_once只執行了一次。

      3. dispatch_group_async && dispatch_group_notify

      dispatch_group主要就是當任務執行有順序的時候可以用到,假如有3個任務,A,B,C,現在想要實現A,B執行完畢之后再執行C。如下:

      當任務A和B執行完畢之后執行C。完美解決。

      4.dispatch_barrier_async

      這個函數我們稱之為柵欄函數,用這個函數添加任務的時候,會查找當前隊列中是否有在此任務之前添加的其他任務沒有執行完畢,如果有,那么等待其他任務執行完畢再執行這個任務,同時在這個任務后面添加的任務必須等待這個柵欄函數任務執行完畢之后才能執行。

      case1

      case2

 

      case3

      case4

      5.dispatch_apply

      這個函數主要用來重復執行任務,該函數是一個同步函數,所以要注意在用的時候不能把任務添加到主線程中避免造成死鎖。

 

        

      三、NSOperation 

      NSOperation是一個抽象類,我們可以理解為任務,我們一般不直接使用他,而是用他的兩個子類NSBlockOperationNSInvocationOperation,或者我們自定義她的子類,下面我們就這幾種用法詳細討論。

      1.自定義子類。

      自定義子類,我們需要做的就是在子類中重寫父類的main方法,把自己的任務添加到main方法中然后 調用start方法執行任務即可。后面會說到NSOperationmQueue,他是用來管理任務的,我們等會再說。

      2.NSBlockOperation

 

      3.NSInvocationOperation

 

      4.NSOperationQueue

       operation創建好之后我們可以通過調用operation 的 start 方法來執行任務。而OperationQueue可以幫我們省去這些麻煩,我們創建好任務operation后直接把operation添加到queue中就可以了,queue幫我們管理任務的執行。queue中的任務是異步並發執行的。

     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM