一介粘、基本概念
線程是用來執(zhí)行任務(wù)的殖氏,線程徹底執(zhí)行完任務(wù)A才能執(zhí)行任務(wù)B,為了同時執(zhí)行兩個任務(wù)姻采,產(chǎn)生了多線程
1雅采、進程
1)進程是應(yīng)用程序的執(zhí)行實例,簡單來說就是在操作系統(tǒng)中運行的程序慨亲,我在手機中只打開QQ和微信兩個軟件婚瓜,系統(tǒng)中就會有兩個進程存在
2)進程不能執(zhí)行任務(wù)
3)進程在運行時創(chuàng)建的資源隨著進程的終止而死亡
2、線程
1)進程本身是不能執(zhí)行任務(wù)的刑棵,進程想要執(zhí)行任務(wù)必須得有線程巴刻,線程是進程內(nèi)部獨立的執(zhí)行單元,同時只能執(zhí)行一個任務(wù)蛉签,相當于一個子程序胡陪。線程被分為兩種茂附,主線程和子線程
2)線程執(zhí)行完畢就會被銷毀
3)主線程:當應(yīng)用程序啟動時自動創(chuàng)建和啟動,通常用來處理用戶的輸入并響應(yīng)各種事件和消息督弓。主線程的終止也意味著程序的結(jié)束
進程一啟動就會自動自動創(chuàng)建
顯示和刷新UI界面
處理UI事件
4)子線程:由主線程來創(chuàng)建营曼,用來幫助主線程執(zhí)行程序的后臺處理任務(wù),如果子線程A中又創(chuàng)建一個子線程B愚隧,在創(chuàng)建之后蒂阱,這兩者就是相互獨立的,多個子線程在效果上可以同時執(zhí)行狂塘。
處理耗時的操作
子線程不能用來刷新UI
3录煤、多線程
1)目前大多數(shù)的app,都需要連接服務(wù)器,而訪問服務(wù)器的速度可能快也可能慢荞胡,如果一個app訪問服務(wù)器的操作沒有在子線程操作的話妈踊,在該app訪問服務(wù)器的過程中,該軟件是不能相應(yīng)用戶的操作的泪漂,只有該app訪問結(jié)束以后廊营,app才能相應(yīng)用戶的操作,這就造成了線程阻塞萝勤,也就是我們常說的卡頓線程
2)一條線程在同一時間內(nèi)只能執(zhí)行一個任務(wù)露筒,但是進程可以有多條線程,可以開啟多條線程來執(zhí)行不同的任務(wù)敌卓,從而提高程序的執(zhí)行效率慎式,避免線程阻塞
3)操作系統(tǒng)會根據(jù)線程的優(yōu)先級來安排CPU的時間,優(yōu)先級高的線程趟径,優(yōu)先調(diào)用的幾率會更大瘪吏,同級的話,看線程執(zhí)行的先后
4)同一時間內(nèi)蜗巧,CPU只能處理一條線程掌眠,只有一條線程在工作,多線程并行執(zhí)行惧蛹,其實就是各個線程不斷切換扇救,因為切換的時間很快很快刑枝,就造成了同時執(zhí)行的假象香嗓,原理如下,比如A装畅、B兩個線程
- A執(zhí)行到某一時間段要切換了靠娱,可A任務(wù)沒有完成,系統(tǒng)就會把A當前執(zhí)行的位置和數(shù)據(jù)以入棧的方式保存起來
- 然后B線程執(zhí)行掠兄,B執(zhí)行時間到了像云,他的位置狀態(tài)也會被系統(tǒng)保存到B的棧中
- 系統(tǒng)自動找到A的棧锌雀,將A之前保存的數(shù)據(jù)恢復,又可以從A之前斷開的狀態(tài)繼續(xù)執(zhí)行下去迅诬,如此循環(huán)
5)系統(tǒng)每開一個線程都有比較大的開銷腋逆,若線程開的過多,不僅會占用大量的內(nèi)存和讓程序更加復雜侈贷,而且會加重CPU的負擔惩歉,這樣會使你的手機更容易發(fā)熱
6)多線程之間能夠?qū)崿F(xiàn)數(shù)據(jù)的共享
二、線程與進程的關(guān)系
1俏蛮、線程是CPU執(zhí)行任務(wù)的基本單位撑蚌,一個進程可以有多個線程,但同時只能執(zhí)行一個任務(wù)
2搏屑、進程就是運行中的軟件争涌,是動態(tài)的
3、一個操作系統(tǒng)可以對應(yīng)多個進程辣恋,一個進程可以有多條線程亮垫,但至少有一個線程
4、同一個進程內(nèi)的線程共享進程里的資源
三伟骨、多線程的作用
1包警、提高程序執(zhí)行效率,避免線程阻塞造成的卡頓現(xiàn)象
2底靠、能適當提高資源利用率(CPU害晦、內(nèi)存)
四、三種多線程編程技術(shù)
1暑中、NSThread
NSThread是輕量級的多線程開發(fā)壹瘟,使用并不復雜,但使用NSThread需要自己管理線程的生命周期
2鳄逾、NSOperation
1)使用NSOperation和NSOperationQueue進行多線程開發(fā)類似于線程池稻轨,只要將一個NSOperation放到NSOperationQueue這個隊列中線程就會以此啟動。
2)NSOperationQueue負責管理雕凹、執(zhí)行所有的NSOperation,在這個過程中可以更加容易管理線程總數(shù)和控制線程之間的依賴關(guān)系
3)NSOperation有兩常用子類用于創(chuàng)建線程操作:NSInvocationOperation和NSBlockOperation殴俱,兩種方式本質(zhì)沒有區(qū)別,但后者使用block形式進行代碼組織枚抵,使用相對方便线欲。
3、GCD
1)CGD是基于C語言開發(fā)的一套多線程開發(fā)機制汽摹,也是目前蘋果官方推薦的多線程開發(fā)方法
2)GCD會自動管理線程的生命周期(創(chuàng)建線程李丰、調(diào)度任務(wù)、銷毀線程)逼泣,程序員只需要告訴GCD想要執(zhí)行什么任務(wù)趴泌,不需要編寫任何代碼管理線程
3)GCD是這三種多線程開發(fā)方式中抽象層次最高的舟舒,使用起來也是最為方便的,只是基于C語言開發(fā)嗜憔,并不像前兩種是面向?qū)ο箝_發(fā)秃励,而是完全面向過程的
4)優(yōu)點,他對于多核運算更加有效吉捶,會自動利用更多的CPU內(nèi)核
5)GCD中也有類似于NSOperationQueue的隊列莺治,GCD統(tǒng)一管理整個隊列中的任務(wù),GCD中的隊列分為并行隊列和串行隊列兩類
串行隊列
只有一個線程帚稠,加入到隊列中的操作按添加順序執(zhí)行
并發(fā)隊列
有多個線程谣旁,操作進來以后會將這些線程安排在可用的處理器上,同時保證先進來的任務(wù)優(yōu)先處理
GCD中有個特殊的隊列就是主隊列滋早,用來執(zhí)行主線程上的操作任務(wù)