iOS多線程GCD

在用GCD之前先來關注三個問題,用什么函數執行?執行什么任務?在什么隊列里面執行?以上三個問題可以看做是組成GCD的三個部分


這里主要想用實驗對比異步并發或者異步全局與異步串行的區別


Number1:先來復習一下

1.用什么函數執行.執行GCD的函數有兩個:同步函數和異步函數.

同步函數:

dispatch_sync(<#dispatch_queue_t queue#>, <#^(void)block#>)

異步函數:

dispatch_async(<#dispatch_queue_t queue#>, <#^(void)block#>)

可以看到,兩者在API的區別就要在于異步函數比同步函數多了一個a

同步函數:不可以開啟新的線程,只能在當前線程執行任務(當前可以是主線程,或者其他線程)

異步函數:可以開啟新的線程,并在新的線程執行任務.異步函數可以看做是多線程的代名詞.

2.執行什么任務

只需要將執行的代碼可以寫在block中既可以了

3.用什么隊列執行

常用到的隊列以下幾種:

1)并發隊列:

dispatch_queue_t queue = dispatch_queue_create("?隊列的名字",DISPATCH_QUEUE_CONCURRENT);

? ? ? ? ?1.以先進先出的方式,在并發調度隊列中的任務執行

? ? ? ? ?2.如果當前調度的任務是同步的,會等待任務執行完成后,才會去執行下一任務

? ? ? ? ?3.如果當前調度的任務是異步的執行的,只要底層線程池中有可用的線程,就會馬上去執

? ? ? ? ? ? ?行任務,不需要等待上一個任務的完成。

? ? ? ? ? ? ?下面我們來做一個實驗:以下是異步并發隊列執行的代碼


? ? ? ?打印的前面一個參數代表當前的線程,從上面的打印結果我們看到了什么?首先從number可以看出這里出現了不止一條線程,起碼這個打印結果出現了31條線程.

? ? ? 其次看后面打印的數字,并不是依次增大的,順序是被打斷的.為什么會這樣呢?先執行的卻在后面被打印出來,而for循環是依次+1增大的.這就說明了,并發隊列在異步函數里面執行時并不會等到上一個任務執行完畢再執行下一個任務,上一個任務它會執行一部分,然后下一個任務再執行一部分,如果有多條線程,它(CPU)會在多條線程(多個任務)之間來回切換,這個執行一點那個也執行一點.也許會按順序執行完成,也許不會按順序執行完成(先執行的可能后執行完,也可能先執行的玩,這是不確定的,是CPU決定的).? ? ? ? ?總結起來一句話,如果當前調度的任務是異步的執行的,只要底層線程池中有可用的線程,就會馬上去執行任務,不需要等待上一個任務的完成。

2).全局隊列:

? ? ? ? ? 是系統為了方便程序員開發提供的,其工作表現與并發隊列一致

上代碼:


反正和并發隊列差不多啦,只是程序員自己用推薦用他,不過不知道為什么



3)串行隊列:

? ? ? ? 1.以先進先出的方式,順充調度隊列的任務

? ? ? ? 2.無論隊列所指定的是執行函數是同步還是導步,都會等上一個任務執行完成之后再執行下

? ? ? ? ? ?一個任務


上面打印結果說明了什么?串行隊列在異步函數里面執行只會開啟一條線程,而且看后面打印的數字,都是順序的,從1到100都是,只是太長就不全部接下來了,不放心可以自己試一試.為什么是順序的?當然如果沒有多線程這句話是屁話,但是相較于上面的異步函數并發或者全局隊列,這說明,串行隊列在執行性任務的時候是順序執行的,只有上一個任務執行完才會執行下一個任務



4).主隊列:dispatch_queue_t queue =dispatch_get_main_queue();

主隊列不需要創建,它是程序啟動就被創建的

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

推薦閱讀更多精彩內容