線程是用來執(zhí)行任務(wù)的惜辑,線程徹底執(zhí)行完任務(wù)A才能去執(zhí)行任務(wù)B。為了同時執(zhí)行兩個任務(wù)疫赎,產(chǎn)生了多線程盛撑。我打開一個視頻軟件,我開辟一個線程A讓它執(zhí)行下載任務(wù)捧搞,我開辟一個線程B抵卫,用來播放視頻。我開辟兩個線程后胎撇,這兩個任務(wù)能同時執(zhí)行陌僵,如果我開辟一個線程,只有下載任務(wù)完成创坞,才能去執(zhí)行播放任務(wù)碗短。
線程相當(dāng)于店里的服務(wù)員,一個服務(wù)員同時只能做一件事情题涨,多顧幾個服務(wù)員偎谁,就能同時做很多事情。
1.多線程:用來執(zhí)行任務(wù)纲堵,線程徹底執(zhí)行完任務(wù)A才能去執(zhí)行任務(wù)B巡雨。為了同時執(zhí)行兩個任務(wù),產(chǎn)生了多個線程
2.進程:操作系統(tǒng)中運行的程序 專業(yè)的講席函,應(yīng)用程序的執(zhí)行實例 不能執(zhí)行任務(wù) 進程在運行時候創(chuàng)建的資源隨著進程的終止而死亡 進程里面可以包含多個線程
3.線程:線程是進程內(nèi)部的一個獨立的執(zhí)行單元 一個線程同時只能執(zhí)行一個任務(wù) 包含主線程(用戶界面線程)和子線程(工作線程或后臺線程) 線程執(zhí)行完畢就會銷毀
主線程:當(dāng)應(yīng)用程序啟動時自動創(chuàng)建和啟動铐望,通常用來處理用戶的輸入并響應(yīng)各種事件和消息 主線程的終止意味著該程序的結(jié)束
子線程:有主線程來創(chuàng)建,用來幫助主線程執(zhí)行程序的后臺處理任務(wù)茂附,如果子線程A中創(chuàng)建了一個子線程B正蛙,在創(chuàng)建之后兩者是相互獨立的,多個子線程之間效果上是可以同時執(zhí)行
多線程:
①目前大多數(shù)的app,都需要連接服務(wù)器营曼,而訪問服務(wù)器的速度可能快也可能很慢乒验。如果一個app訪問服務(wù)器的操作沒有在子線程操作的話,在該app訪問服務(wù)器的過程中蒂阱,該軟件是不能響應(yīng)用 戶的操作的锻全,只有該app訪問結(jié)束以后,app才能響應(yīng)用戶的操作录煤,這就造成線程阻塞鳄厌,也就是我們常見的卡頓現(xiàn)象。一條線程在同一時間內(nèi)只能執(zhí)行一個任務(wù),但是進程可以有多條線程妈踊×撕浚可以開啟多條線程來執(zhí)行不同的任務(wù),從而提高程序的執(zhí)行效率,避免線程阻塞响委。
② 每個線程都可以設(shè)置優(yōu)先級新思,操作系統(tǒng)會根據(jù)線程的優(yōu)先級來安排CPU的時間窖梁,優(yōu)先級高的線程,優(yōu)先調(diào)用的幾率會更大夹囚,同級的話纵刘,執(zhí)行的先后對線程執(zhí)行的先后有影響
③ 同一時間內(nèi),CPU只能處理一條線程荸哟,只有一條線程在工作假哎。多線程并行執(zhí)行,其實就是各個線程不斷切換鞍历,因為執(zhí)行切換的時間很快很快舵抹,就造成了同時執(zhí)行的假象,原理如下劣砍,比如A惧蛹,B兩個線程;
(1)A執(zhí)行到某一時間段要切換了刑枝,可A任務(wù)沒完成香嗓,系統(tǒng)就會把A當(dāng)前執(zhí)行的位置和數(shù)據(jù)以入棧的方式保存起來
(2)然后B線程執(zhí)行,B執(zhí)行時間到了装畅,它的位置狀態(tài)等也會被系統(tǒng)保存到B的棧中靠娱。
(3)系統(tǒng)自動找到A的棧,將A之前保存的數(shù)據(jù)恢復(fù)掠兄,又可以從A之前斷開的狀態(tài)繼續(xù)執(zhí)行下去像云,如此循環(huán)
(4) 系統(tǒng)每開一個線程都有比較大的開銷,若線程開的過多蚂夕,不僅會占用大量內(nèi)存和讓城鄉(xiāng)變得更加復(fù)雜迅诬,而且會加重CPU的負擔(dān),這樣的軟件双抽,會讓你省掉冬天買暖手寶的錢百框。
4.一個進程可以有多個線程,并且所有線程都在該進程的虛擬地址空間中牍汹,可以使用進程的全局變和系統(tǒng)資源
5. 多線程的優(yōu)勢
①提高程序執(zhí)行效率,避免線程阻塞造成的卡頓現(xiàn)象
②能適當(dāng)提高資源利用率(CPU,內(nèi)存)
6. 多線程的不足
①開啟線程需要占用一定的內(nèi)存空間
②線程越多柬泽,CPU在線程調(diào)度上的開銷就越大
③程序設(shè)計更加復(fù)雜:比如線程之間的通信慎菲、多線程的數(shù)據(jù)共享
線程與進程的關(guān)系
線程是CPU執(zhí)行任務(wù)的基本單位,一個進程可以有多個線程锨并,但同時只能執(zhí)行一個任務(wù)露该。
進程就是運行中的軟件,是動態(tài)的第煮。
一個操作系統(tǒng)可以對應(yīng)多個進程,一個進程可以有多條線程,但至少有一個線程
同一個進程內(nèi)的線程共享進程里的資源
主線程
進程一啟動就自動創(chuàng)建
顯示和刷新UI界面
處理UI事件
子線程的作用
處理耗時的操作
子線程不能用來刷新UI
使用NSOperation和NSOperationQueue進行多線程開發(fā)類似于線程池解幼,只要將一個NSOperation(實際開發(fā)中需要使用其子類NSInvocationOperation抑党、NSBlockOperation)放到NSOperationQueue這個隊列中線程就會依次啟動。NSOperationQueue負責(zé)管理撵摆、執(zhí)行所有的NSOperation底靠,在這個過程中可以更加容易管理線程總數(shù)和控制線程之間的依賴關(guān)系。
NSOperation有兩常用子類用于創(chuàng)建線程操作:NSInvocationOperation和NSBlockOperation特铝,兩種方式本質(zhì)沒有區(qū)別暑中,但后者使用block形式進行代碼組織,使用相對方便鲫剿。
GCD是基于C語言開發(fā)的一套多線程開發(fā)機制鳄逾,也是目前蘋果官網(wǎng)推薦的多線程開發(fā)方法。
GCD會自動管理線程的生命周期(創(chuàng)建線程灵莲、調(diào)度任務(wù)雕凹、銷毀線程),程序員只需要告訴GCD想要執(zhí)行什么任務(wù)政冻,不需要編寫任何線程管理代碼
GCD是這三種多線程開發(fā)方式中抽象層次最高的枚抵,使用起來也是最為方便的,只是基于C語言開發(fā)赠幕,并不像前兩種是面向?qū)ο箝_發(fā)俄精,而是完全面向過程的。這種機制相比較于前面兩種多線程開發(fā)方式最顯著的優(yōu)點就是它對于多核運算更加有效榕堰,會自動利用更多的CPU內(nèi)核(比如雙核竖慧、四核)。
GCD中也有一個類似于NSOperationQueue的隊列逆屡,GCD統(tǒng)一管理整個隊列中的任務(wù)圾旨。但是GCD中的隊列分為并行隊列和串行隊列兩類:
1、串行隊列:只有一個線程魏蔗,加入到隊列中的操作按添加順序依次執(zhí)行砍的。
2、并發(fā)隊列:有多個線程莺治,操作進來以后他會將這些線程安排在可用的處理器上廓鞠,同時保證先進來的任務(wù)優(yōu)先處理。
其實在GCD中還有一個特殊隊列就是主隊列谣旁,用來執(zhí)行主線程上的操作任務(wù)床佳。