一些關於隊列,同步,異步的概念


進程:正在進行的程序,我們就叫它進程.

線程:線程就是進程中的一個獨立的執行路徑.這句話怎么理解呢! 一個程序它是按順序從上往下執行的, 這個執行順序我們可以把它看成是一條線,把這條線就叫做線程(個人理解,錯了勿噴);每一個程序中至少包含一條線程, 這條線程,我們叫它主線程.

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

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

任務分為同步任務與異步任務,它們的區別是:
    同步任務優先級高,在線程中有執行順序,不會開啟新的線程。
    異步任務優先級低,在線程中執行沒有順序,看cpu閑不閑。在主隊列中不會開啟新的線程,其他隊列會開啟新的線程。

隊列:隊列我們可以把它理解為是管理任務的,它里面放着很多的任務,來管理這些任務什么時候在哪些線程里面執行.隊列是先進先出的

隊列分為串行隊列和並行隊列

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

串行隊列開啟異步任務,是有順序的

並行隊列里開啟同步任務是有執行順序的,只有異步才沒有順序

來侃侃在主隊列中開啟同步任務為什么會阻塞線程?

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

為啥串行隊列開啟異步任務后嵌套同步任務造成死鎖?(不作死就不會死)

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

串行隊列中開啟同步任務后嵌套同步任務造成死鎖(再套幾下,就不知道怎么死的了)?

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

串行隊列開啟同步任務后嵌套異步任務就不會造成死鎖,開啟異步,就會開啟一個新的線程,不會阻塞線程

主線程隊列和GCD創建的隊列也是有區別?

主線程隊列和GCD創建的隊列是不同的。在GCD中創建的隊列優先級沒有主隊列高,所以在GCD中的串行隊列開啟同步任務里面沒有嵌套任務是不會阻塞主線程,只有一種可能導致死鎖,就是串行隊列里,嵌套開啟任務,有可能會導致死鎖。

主線程隊列中不能開啟同步,會阻塞主線程。只能開啟異步任務,開啟異步任務也不會開啟新的線程,只是降低異步任務的優先級,讓cpu空閑的時候才去調用。而同步任務,會搶占主線程的資源,會造成死鎖。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM