IOS中多線程的總結
首先要知道線程和進程的區別。一個系統上運行的每一個應用程序都是一個線程。而進程中要執行的任務都是在線程上來實現的,所以說線程是進程的最小執行單元。
進程最少要有一個線程。多線程,顧名思義就是多條線程。
那麽在ios開發中運用到的多線程都有哪些呢,都有什麽區別的,下面我們就來詳細的吐槽一波。
說到多線程不得不提到POSix threads,簡稱PThreads。他是類Unix操作系統中管理線程的一套完整的API。具體的PThreads自己問一下性感迷人的度娘娘嘞!而Ios開發中我們碰到的線程管理具體的有3類,分別是:NSThread
一、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中多線程的總結