iOS多線程同步異步、串行併發的我的剖析(GCD)

先來講一個隊列和任務:程序員

隊列分爲串行和並行多線程

串行要當即執行而且執行完併發

任務的執行分爲同步和異步異步

這兩兩組合就成爲了串行隊列同步執行,串行隊列異步執行,並行隊列同步執行,並行隊列異步執行spa

而異步是多線程的代名詞,異步在實際引用中會開啓新的線程,執行耗時操做。線程

 

那咱們先來知道一個很是重要的事情:隊列

-------  隊列只是負責任務的調度,而不負責任務的執行   ---------開發

------- 任務是在線程中執行的  ---------get

 

隊列和任務的特色:同步

隊列的特色:先進先出,排在前面的任務最早執行,

串行隊列:任務按照順序被調度,前一個任務不執行完畢,隊列不會調度

並行隊列:只要有空閒的線程,隊列就會調度當前任務,交給線程去執行,不須要考慮前面是都有任務在執行,只要有線程能夠利用,隊列就會調度任務。

主隊列:專門用來在主線程調度任務的隊列,因此主隊列的任務都要在主線程來執行,主隊列會隨着程序的啓動一塊兒建立,咱們只需get便可

全局隊列:是系統爲了方便程序員開發提供的,其工做表現與併發隊列一致,那麼全局隊列跟併發隊列的區別是什麼呢?

1.全局隊列:不管ARC仍是MRC都不須要考錄釋放,由於系統提供的咱們只須要get就能夠了

2.併發隊列:再MRC下,併發隊列建立出來後,須要手動釋放dispatch_release()

同步執行:不會開啓新的線程,任務按順序執行

異步執行:會開啓新的線程,任務能夠併發的執行

 

那麼有這麼幾種組合

  1. 串行隊列同步執行:綜合上面闡述的串行隊列的特色 --- 按順序執行,同步:不會開啓新的線程,則串行隊列同步執行只是循序漸進的one by one執行。
  2. 串行隊列異步執行:雖然隊列中存放的是異步執行的任務,可是結合串行隊列的特色,前一個任務不執行完畢,隊列不會調度,因此串行隊列異步執行也是one by one的執行
  1. 並行隊列同步執行:結合上面闡述的並行隊列的特色,和同步執行的特色,能夠明確的分析出來,雖然並行隊列能夠不需等待前一個任務執行完畢就可調度下一個任務,可是任務同步執行不會開啓新的線程,因此任務也是one by one的執行
  2. 並行隊列異步執行:再上一條中說明了並行隊列的特色,而異步執行是任務能夠開啓新的線程,因此這中組合能夠實現任務的併發,再實際開發中也是常常會用到的

 

GCD實現原理:

GCD有一個底層線程池,這個池中存放的是一個個的線程。之因此稱爲「池」,很容易理解出這個「池」中的線程是能夠重用的,當一段時間後這個線程沒有被調用胡話,這個線程就會被銷燬。注意:開多少條線程是由底層線程池決、、、、、定的(線程建議控制再3~5條),池是系統自動來維護,不須要咱們程序員來維護(看到這句話是否是很開心?)

而咱們程序員須要關心的是什麼呢?咱們只關心的是向隊列中添加任務,隊列調度便可。

  • 若是隊列中存放的是同步任務,則任務出隊後,底層線程池中會提供一條線程供這個任務執行,任務執行完畢後這條線程再回到線程池。這樣隊列中的任務反覆調度,由於是同步的,因此當咱們用currentThread打印的時候,就是同一條線程。
  • 若是隊列中存放的是異步的任務,(注意異步能夠開線程),當任務出隊後,底層線程池會提供一個線程供任務執行,由於是異步執行,隊列中的任務不需等待當前任務執行完畢就能夠調度下一個任務,這時底層線程池中會再次提供一個線程供第二個任務執行,執行完畢後再回到底層線程池中。
  • 這樣就對線程完成一個複用,而不須要每個任務執行都開啓新的線程,也就從而節約的系統的開銷,提升了效率。在iOS7.0的時候,使用GCD系統一般只能開5~8條線程,iOS8.0之後,系統能夠開啓不少條線程,可是實在開發應用中,建議開啓線程條數:3~5條最爲合理。
相關文章
相關標籤/搜索