iOS-佇列.執行緒.任務

weixin_33782386發表於2018-01-04

現在先說兩個基本的概念,啥是程式,啥是執行緒,啥又是多執行緒;先把這兩個總是給弄清再講下面的
程式:正在進行的程式,我們就叫它程式.

現在先說兩個基本的概念,啥是程式,啥是執行緒,啥又是多執行緒;先把這兩個總是給弄清再講下面的
程式:正在進行的程式,我們就叫它程式.

多執行緒:多執行緒也就是說一個程式中有多條執行路徑.在iOS當中將一些比較耗時的操作放到另一條執行路徑裡.讓它與主執行緒同時執行.這樣不會造成主執行緒的堵塞.

扯完了這些那我們來看看什麼是任務,什麼是佇列!

 任務分為同步任務與非同步任務,它們的區別是:

 同步任務優先順序高,線上程中有執行順序,不會開啟新的執行緒。

 非同步任務優先順序低,線上程中執行沒有順序,看cpu閒不閒。在主佇列中不會開啟新的執行緒,其他佇列會
 開啟新的執行緒。

 佇列:佇列我們可以把它理解為是管理任務的,它裡面放著很多的任務,來管理這些任務什麼時候在哪些執行緒        
 裡面執行.佇列是先進先出的

佇列分為序列佇列和並行佇列

序列佇列:佇列中的任務按順序執行(不會同時執行)並行佇列:佇列中的任務會併發執行,可能會有一個疑問,佇列不是先進先出嗎,如果後面的任務執行完了,怎麼出去的了。這裡需要強調下,任務執行完畢了,不一定出佇列。只有前面的任務執行完了,才會出佇列。

序列佇列開啟非同步任務,是有順序的

並行佇列裡開啟同步任務是有執行順序的,只有非同步才沒有順序

來侃侃在主佇列中開啟同步任務為什麼會阻塞執行緒?

在主佇列開啟同步任務,因為主佇列是序列佇列,裡面的執行緒是有順序的,先執行完一個執行緒才執行下一個執行緒,而主佇列始終就只有一個主執行緒,主執行緒是不會執行完畢的,因為他是無限迴圈的,除非關閉應用程式。因此在主執行緒開啟一個同步任務,同步任務會想搶佔執行的資源,而主執行緒任務一直在執行某些操作,不肯放手。兩個的優先順序都很高,最終導致死鎖,阻塞執行緒了

主執行緒佇列中不能開啟同步

主執行緒佇列中不能開啟同步,會阻塞主執行緒。只能開啟非同步任務,開啟非同步任務也不會開啟新的執行緒,只是降低非同步任務的優先順序,讓cpu空閒的時候才去呼叫。而同步任務,會搶佔主執行緒的資源,會造成死鎖。

為啥序列佇列開啟非同步任務後巢狀同步任務造成死鎖?(不作死就不會死)

因為序列佇列中執行緒是有執行順序的,需要等上面開啟的非同步任務執行完畢,才會執行下面開啟的同步任務。而上面的非同步任務還沒執行完,要到下面的大括號才算執行完畢,而下面的同步任務已經在搶佔資源了,就會發生死鎖。

序列佇列中開啟同步任務後巢狀同步任務造成死鎖(再套幾下,就不知道怎麼死的了)?

因為序列佇列中執行緒是有執行順序的,需要等上面開啟的同步任務執行完畢,才會執行下面開啟的同步任務。而上面的同步任務還沒執行完,要到下面的大括號才算執行完畢,而下面的同步任務已經在搶佔資源了,就會發生死鎖
序列佇列開啟同步任務後巢狀非同步任務就不會造成死鎖,開啟非同步,就會開啟一個新的執行緒,不會阻塞執行緒

主執行緒佇列和GCD建立的佇列也是有區別?

主執行緒佇列和GCD建立的佇列是不同的。在GCD中建立的佇列優先順序沒有主佇列高,所以在GCD中的序列佇列開啟同步任務裡面沒有巢狀任務是不會阻塞主執行緒,只有一種可能導致死鎖,就是序列佇列裡,巢狀開啟任務,有可能會導致死鎖。

相關文章