多線程知識在iOS開發(fā)開發(fā)中是非常重要的一塊內(nèi)容梭灿,同時也是大多數(shù)程序員出去面試最愛問的知識點之一阴汇,當然也是我們進階路上必須翻過的一道坎,多線程內(nèi)容主要涉及兩大塊核心點尼桶,一是線程二是對列操灿。
1 線程
進程和線程都是操作系統(tǒng)的概念,進程是應用程序的執(zhí)行實例泵督,每個進程都有私有的虛擬地址空間趾盐,代碼,數(shù)據(jù)和其他系統(tǒng)資源小腊。
線程是進程的一個內(nèi)部執(zhí)行單元救鲤,系統(tǒng)創(chuàng)建好后實際上就啟動了一個該進程的主執(zhí)行線程,所以當我們打開app時秩冈,其實也就啟動了一個主線程本缠,這個主線程不需要我們手動去創(chuàng)建,二是系統(tǒng)已經(jīng)為我們創(chuàng)建好的入问。除了主線程以外我們還可以根據(jù)自己需要創(chuàng)建其他線程丹锹,線程本身占用資源或很少的資源,但是線程需要CPU分配時間芬失,如果某項任務長時間占用CPU時間楣黍,會擠壓其他線程的CPU時間,導致線程等待棱烂。這就是同步線程必須上一個任務執(zhí)行完才會執(zhí)行下一個任務租漂。
異步線程則不會阻塞線程執(zhí)行,給人的感覺是多個任務同步執(zhí)行垢啼,實際上并非如此窜锯,后面會講到张肾。
2對列
對列是一種數(shù)據(jù)結構芭析,它具有先進先出的特點,是只允許在一端進行插入操作吞瞪,而在另一端進行刪除操作的線性表馁启。在iOS開發(fā)中對列其實就是一個任務的集合,主要有串行對列和并行對列兩種,最先添加到對列中的任務最先被執(zhí)行惯疙。
有了以上的基礎知識鋪墊翠勉,我們開始談談GCD
蘋果官方給出的解釋:GCD是異步執(zhí)行任務的技術之一。一般將應用程序中記述的線程管理代碼在系統(tǒng)集中實現(xiàn)霉颠,開發(fā)者只需要定義想執(zhí)行的任務并追加到適當?shù)腄ispatch Queue中对碌,GCD就可以生成必要的線程并計劃執(zhí)行任務。這里不需要我們手動管理線程生命周期蒿偎,只需要把人物添加到對列中即可朽们。
1串行對列
串行對列中,任務會一個一個按照先進先出的順序诉位,執(zhí)行必須上一個任務執(zhí)行完畢再執(zhí)行下一個任務骑脱。在同步對列中將任務放到異步線程中,會創(chuàng)建新的線程苍糠,但是任務的執(zhí)行順序依然是按照任務添加的順序執(zhí)行叁丧。
2并行對列
并發(fā)對列可以讓多個任務同時執(zhí)行(可以開啟多個線程),但是只有在異步線程中才有效岳瞭,如果你在并發(fā)對列中添加的是同步任務拥娄,任務執(zhí)行順序依然是按照串行的執(zhí)行順序,切不會創(chuàng)建新的線程寝优。
并發(fā)對列中任務看起來是同時進行条舔,實際上是CPU在進程任務執(zhí)行的時候在多個線程快速切換,給人的感覺好像是任務被同步執(zhí)行乏矾,不過這種線程之間的切換會消耗資源孟抗,雖然異步線程會創(chuàng)建新的線程,但不會無限創(chuàng)建下去钻心,CPU會根據(jù)資源調(diào)度合理創(chuàng)建線程數(shù)量凄硼。
同步和異步
同步不會創(chuàng)建新的線程,任務會按照順序執(zhí)行捷沸,會阻塞當前線程摊沉,異步會創(chuàng)建新的線程,任務會在新線程執(zhí)行痒给,不會阻塞當前線程说墨。
線程死鎖
串行對列的問題,比如異步線程里嵌套同步線程 苍柏。只有第一個任務走完才會走第二個任務尼斧,異步線程,開啟了一個子線程试吁,子線程里里面嵌套了一個同步線程棺棵,會阻礙當前線程的異步線程,但是由于是串行隊列必須第一個任務走完才會走第二個,于是乎同步線程會等待異步線程執(zhí)行完才會去執(zhí)行烛恤,但是此時異步線程被阻塞無法繼續(xù)走下去母怜,必須等待,這就形成了相互等待的死鎖狀態(tài)缚柏。
在下一次的文章里我會把代碼加上苹熏,這篇文章只是希望大家能夠?qū)Χ嗑€程有個大概的認識。