先來講一個隊列和任務:程序員
隊列分爲串行和並行多線程
串行要當即執行而且執行完併發
任務的執行分爲同步和異步異步
這兩兩組合就成爲了串行隊列同步執行,串行隊列異步執行,並行隊列同步執行,並行隊列異步執行spa
而異步是多線程的代名詞,異步在實際引用中會開啓新的線程,執行耗時操做。線程
那咱們先來知道一個很是重要的事情:隊列
------- 隊列只是負責任務的調度,而不負責任務的執行 ---------開發
------- 任務是在線程中執行的 ---------get
隊列和任務的特色:同步
隊列的特色:先進先出,排在前面的任務最早執行,
串行隊列:任務按照順序被調度,前一個任務不執行完畢,隊列不會調度
並行隊列:只要有空閒的線程,隊列就會調度當前任務,交給線程去執行,不須要考慮前面是都有任務在執行,只要有線程能夠利用,隊列就會調度任務。
主隊列:專門用來在主線程調度任務的隊列,因此主隊列的任務都要在主線程來執行,主隊列會隨着程序的啓動一塊兒建立,咱們只需get便可
全局隊列:是系統爲了方便程序員開發提供的,其工做表現與併發隊列一致,那麼全局隊列跟併發隊列的區別是什麼呢?
1.全局隊列:不管ARC仍是MRC都不須要考錄釋放,由於系統提供的咱們只須要get就能夠了
2.併發隊列:再MRC下,併發隊列建立出來後,須要手動釋放dispatch_release()
同步執行:不會開啓新的線程,任務按順序執行
異步執行:會開啓新的線程,任務能夠併發的執行
那麼有這麼幾種組合
GCD實現原理:
GCD有一個底層線程池,這個池中存放的是一個個的線程。之因此稱爲「池」,很容易理解出這個「池」中的線程是能夠重用的,當一段時間後這個線程沒有被調用胡話,這個線程就會被銷燬。注意:開多少條線程是由底層線程池決、、、、、定的(線程建議控制再3~5條),池是系統自動來維護,不須要咱們程序員來維護(看到這句話是否是很開心?)
而咱們程序員須要關心的是什麼呢?咱們只關心的是向隊列中添加任務,隊列調度便可。