多線程一直是一個(gè)非常重要的概念,不管是在開發(fā)過程中,還是在各種技術(shù)面試中,都非常受青睞,所以就讓我的iOS進(jìn)階之路從多線程開始吧。這系列文章都僅僅是記錄我的學(xué)習(xí)和思考過程,如有紕漏,感謝留言指正。
1、基本概念
1.1 進(jìn)程
通俗的講,一個(gè)程序,一個(gè)APP就是一個(gè)進(jìn)程,進(jìn)程是系統(tǒng)進(jìn)行資源分配的最基本的單元。每一個(gè)APP在安裝到手機(jī)里面后,系統(tǒng)為了便于解決多任務(wù)同時(shí)運(yùn)行的問題,會(huì)增加一個(gè)中間層來間接訪問物理內(nèi)存,即通常所說的虛擬內(nèi)存。虛擬內(nèi)存給每個(gè)進(jìn)程創(chuàng)建一個(gè)單獨(dú)的執(zhí)行環(huán)境,這樣每個(gè)進(jìn)程就只能訪問自己的地址空間,從而進(jìn)程與進(jìn)程之間也就能被安全的隔離開來了。
1.2 線程
線程是進(jìn)程的執(zhí)行單元,進(jìn)程的各種大事小事,都是通過線程來處理的,一個(gè)進(jìn)程至少會(huì)有一個(gè)線程。在iOS里面,眾所周知APP運(yùn)行后默認(rèn)會(huì)開啟一個(gè)主線程。
1.3 主線程
由上面描述的可知,主線程就是系統(tǒng)默認(rèn)創(chuàng)建的一個(gè)線程,所以它比較特殊,它是大兒子。進(jìn)程啟動(dòng)之后,由它去加載main函數(shù),從而加載我們開發(fā)好的APP內(nèi)容。
iOS里面主線程主要負(fù)責(zé)處理UI,所有更新UI的操作都必須在主線程上執(zhí)行??赡苡械臅r(shí)候我們的程序運(yùn)行時(shí),會(huì)有一些紫色的報(bào)錯(cuò),通常都是提示該UI刷新的代碼需要在主線程執(zhí)行。
另外,我們之所以會(huì)需要使用多線程,主要還是因?yàn)橛行┎僮鞅容^耗時(shí),而如果所有這些操作都在主線程執(zhí)行,就會(huì)導(dǎo)致主線程被阻塞,肉眼觀察到的就是程序卡頓或者界面凍結(jié)等現(xiàn)象。所以使用多線程來處理耗時(shí)操作,分擔(dān)主線程的一些壓力。
1.4 多線程
大家都知道,在計(jì)算機(jī)剛剛誕生的時(shí)代,它是單核CPU,在那時(shí),在某一時(shí)刻,CPU實(shí)際意義上只能執(zhí)行一個(gè)線程。但是由于CPU可以在多條線程中快速切換,如果切換足夠快的話,看上去就好像實(shí)現(xiàn)了多線程并發(fā)的假象。
直到后來出現(xiàn)了多核CPU,才真正意義上實(shí)現(xiàn)了多線程的概念。使用多線程的最終目的也說過了,就是把耗時(shí)的操作從主線程中分擔(dān)出來。
2、線程的生命周期
iOS中線程的生命周期主要有四個(gè)過程,創(chuàng)建(新建和就緒)、運(yùn)行、結(jié)束和銷毀,這四個(gè)過程恰恰與底層pThread的四個(gè)過程一致。通過一張圖可以加深理解:

線程創(chuàng)建:線程通過新建(create)后首先在內(nèi)存中處于等待狀態(tài),此時(shí)處于不可調(diào)度狀態(tài)。通過開啟(start)線程讓其進(jìn)入就緒狀態(tài),當(dāng)前線程進(jìn)入到可調(diào)度線程池。
線程運(yùn)行:通過CPU調(diào)度讓其運(yùn)行起來。如果在某種條件下CPU被切換到其他線程,此時(shí)當(dāng)前線程會(huì)被掛起,知道下一次CPU重新調(diào)度該線程時(shí)恢復(fù)該線程的運(yùn)行。
線程結(jié)束:當(dāng)前線程如果所有操作都完成,或者說出現(xiàn)了異常、或者被強(qiáng)制退出,此時(shí)線程會(huì)立刻結(jié)束運(yùn)行。
線程銷毀:線程結(jié)束后,同時(shí)會(huì)被釋放。
所有這幾個(gè)過程后續(xù)都能在多線程的應(yīng)用中的更深入的體現(xiàn),此篇只了解基本概念。