標籤:全域 gcd dispatch queue sop 多線程 nsthread blog 線程管理
首先要知道線程和進程的區別。一個系統上啟動並執行每一個應用程式都是一個線程。而進程中要執行的任務都是線上程上來實現的,所以說線程是進程的最小執行單元。
進程最少要有一個線程。多線程,顧名思義就是多條線程。
那麼在ios開發中運用到的多線程都有哪些呢,都有什麼區別的,下面我們就來詳細的吐槽一波。
說到多線程不得不提到POSix threads,簡稱PThreads。他是類Unix作業系統中管理線程的一套完整的API。具體的PThreads自己問一下性感迷人的度娘娘嘞!而Ios開發中我們碰到的線程管理具體的有3類,分別是:NSThread,NSOperation(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.並行隊列 + 非同步執行
任務沒有按順序執行。
IOS中多線程的總結