最通俗的描述就是一個個pid,官方的說法:程序是程式在計算機上的一次執行活動。打開一個app 就開啟了一個程序。可包含多個線程。

獨立執行的代碼段,一個線程同一時間内隻能執行一個任務,反之多線程并發就可以在同一時間執行多個任務。
一個同步函數隻在完成了預定任務後才傳回。會阻塞目前線程。異步時任務開啟會立即傳回,不阻塞目前線程去執行下一個函數。異步會開啟其他線程。
串行:任務按先後順序逐個執行。并發:後面的任務不會等前面的任務完成了再執行,同樣會遵循先添加先執行的原則,但添加間隔往往忽略不計。是以看上去像是一起執行。
并發和并行通常被一起提到,是以值得花些時間解釋它們之間的差別。
并發代碼的不同部分可以“同步”執行。然而,該怎樣發生或是否發生都取決于系統。多核裝置通過并行來同時執行多個線程;然而,為了使單核裝置也能實作這一點,它們必須先運作一個線程,執行一個上下文切換,然後運作另一個線程或程序。這通常發生地足夠快以緻給我們并發執行地錯覺,如下圖所示:
雖然你可以編寫代碼在 gcd 下并發執行,但 gcd 會決定有多少并行的需求。并行要求并發,但并發并不能保證并行。
gcd 是一套低層api,用于将任務切分成單一任務送出至隊列并發或者串行執行。遵循fifo 原則,先送出到隊列的先執行。串行隊列和并發隊列都是如此。
串行隊列中的任務一次執行一個,每個任務隻在前一個任務完成時才開始。而且,你不知道在一個 block 結束和下一個開始之間的時間長度,如下圖所示:
在并發隊列中的任務能得到的保證是它們會按照被添加的順序開始執行,但這就是全部的保證了。任務可能以任意順序完成,你不會知道何時開始運作下一個任務,或者任意時刻有多少 block 在運作。再說一遍,這完全取決于 gcd 。
下圖展示了一個示例任務執行計劃,gcd 管理着四個并發任務:
main quene
主線程隊列,串行,可以通過dispatch_get_main_quene() 擷取。ui操作都需要在主線程中執行。
global quene
系統提供的并發隊列。通過dispatch_get_global_queue 建立。
custom quene
自定義隊列,可以為串行,也可為并發。通過dispatch_queue_create 建立。
将多線程進行分組,最大的好處是可獲知所有線程的完成情況。當多線程并發執行時,由于單個線程什麼時候結束并不知道,是以很難判斷線程組整個完成情況,通過dispatch_group_notify,可以直接監聽組裡所有線程完成情況。
global quene 及 custom quene(建立串行隊列)
1.1 并發隊列,異步執行
此處為直接使用global_quene
nslog列印結果為:
可看到執行完成為無序的,而且每次都不一樣。同樣也能看到出主線程外,另外開啟了5個線程。 注意此處用的是nslog 輸出,而不是println。因為nslog 本身是同步的,而println 為異步,在多線程并發調用時println 輸出結果會錯亂。
1.2 并發隊列,同步執行
還是上面的例子,緊改為同步執行dispatch_sync
列印結果為:
可看到并沒有開啟其他線程,任務按順序逐個執行,同時阻塞主線程。搞不懂這種“并發隊列,同步執行”的意義所在。
1.3 串行隊列,異步執行
可以看到另外開啟了一個線程,不會将主線程阻塞,任務按順序執行。
1.4 串行隊列,同步執行
使用dispatch_quene_creat 建立串行隊列
可看到不會開啟其他線程,會阻塞主線程,任務按順序執行。
1.5 custom quene 建立并發隊列
還是一樣的例子,隻不過改為
可看到異步,同步執行結果與1.1 和1.2 一樣。就不一一列出了。
main quene 使用,線程死鎖
想必這個應該都知道怎麼用,在其他線程中回到主線程,去執行ui操作。注意是在其他線程中擷取主線程。是以要注意以下問題。
2.1 不要在主線程中擷取主線程隊列,并同步執行任務。
這種寫法一定會線程死鎖。同步執行首先就阻塞了主線程,然後又想在主線程去執行任務是以任務沒法完成,任務沒法完成又導緻了線程沒法結束。是以導緻了惡性循環,主線程就一直這麼阻塞着。導緻ui一直卡住。
隊列組
3.1 使用場景
個人覺得先要知道什麼時候需要使用到隊列組。隊列組一般配合dispatch_group_notify 使用,用于監聽這一組任務是否全部完成。是以使用場景為:
同時也不要認為隊列組就會有很多隊列,其實不是,隊列組其實是要實作的是對線程所有任務的分組監聽,是以隻有一個隊列也可以
3.1.1異步執行,串行隊列組
可看到除主線程外,有其他一個線程,串行任務結束後能夠實時監聽到,回到主線程。
3.1.2異步執行,并發隊列組
同樣所有線程的任務全部結束後,能監聽到,通知主線程。
本文憑借個人了解,同時也參考了不少部落格。列舉了gcd的一些正常用法,還有很多特性沒有一一列出。不熟的知識點不敢亂寫,以後再慢慢完善。ios 多線程也不僅僅是gcd 這一種,但我覺得最好用的還是gcd。覺得有用就打賞,點贊,同時有錯誤忘指正...