iOS線程相關(guān)

1.什么是進(jìn)程

進(jìn)程是指系統(tǒng)正在運(yùn)行的一個(gè)應(yīng)用程序。每個(gè)進(jìn)程之間是獨(dú)立的,每個(gè)進(jìn)程均運(yùn)行在其專用且受保護(hù)的內(nèi)存空間內(nèi)。

2.線程

1個(gè)進(jìn)程要想執(zhí)行任務(wù),必須要有線程(每個(gè)進(jìn)程至少要有一條線程),一個(gè)進(jìn)程的所有任務(wù)都在線程中執(zhí)行。

3.線程的串行

線程中任務(wù)是有順序的,是串行的。如果要在一個(gè)線程中執(zhí)行多個(gè)任務(wù),那么只能一個(gè)一個(gè)的按照順序執(zhí)行這些任務(wù),也就是說,在同一時(shí)間內(nèi),一個(gè)線程只能執(zhí)行一個(gè)任務(wù)。

4.進(jìn)程和線程的比較

1.線程是CPU調(diào)度的最小單位。

2.進(jìn)程是CPU分配資源和調(diào)度的單位。

3.一個(gè)程序可以對(duì)應(yīng)多個(gè)進(jìn)程,一個(gè)進(jìn)程可以有多個(gè)線程,但是至少一個(gè)線程

4.同一進(jìn)程內(nèi)的所有線程共享進(jìn)程的資源。

5.什么是多線程

一個(gè)進(jìn)程中可以開啟多條線程,每條線程可以并行(同時(shí))執(zhí)行不同的任務(wù)。

6.多線程的原理

同一時(shí)間,CPU只能處理一條線程,只有一條線程在工作,多線程并發(fā)執(zhí)行,其實(shí)是CPU快速的在多條線程之間調(diào)度(切換)。如果按照CPU調(diào)度線程的時(shí)間非???,就造成了多線程并發(fā)執(zhí)行的假象。

思考:如果線程非常多,會(huì)發(fā)生什么?

CPU會(huì)在n多線程之間調(diào)度,CPU會(huì)累死,消耗大量的CPU資源。

7.多線程的優(yōu)缺點(diǎn)

1.優(yōu)點(diǎn):能適當(dāng)?shù)奶岣叱绦虻膱?zhí)行效率,能適當(dāng)提高資源利用率

2.缺點(diǎn):創(chuàng)建線程是有開銷的(iOS下主要成本包括,內(nèi)核數(shù)據(jù)結(jié)構(gòu)(大約1kb)、??臻g(子線程512kb,主線程1mb,))創(chuàng)建線程大約需要90毫秒的創(chuàng)建時(shí)間

如果開啟大量的線程會(huì)降低程序的性能。

.線程越多,CPU在調(diào)度線程上的開銷越大

.程序設(shè)計(jì)更加復(fù)雜,比如線程之間的通信,多線程的數(shù)據(jù)共享。

8.多線程在iOS開發(fā)中的應(yīng)用

8.1什么是主線程

一個(gè)Ios程序運(yùn)行后,默認(rèn)會(huì)開啟一條線程,成為主線程。

8.2主線程的主要作用

顯示/刷新UI界面

處理UI事件(比如點(diǎn)擊事件、滾動(dòng)事件、拖拽事件等)

9.使用主線程注意的地方:

不要將耗時(shí)的操作放倒主線程中

耗時(shí)操作會(huì)卡住主線程,會(huì)嚴(yán)重影響UI的流暢度

如果將耗時(shí)操作放到主線程,由于子線程的串行執(zhí)行,會(huì)卡住主線程

10.ios中多線程的實(shí)現(xiàn)方案

pthread,一套通用的多線程API,跨平臺(tái),可移植,使用難度大

nsthread:使用面向?qū)ο?,?jiǎn)單易用,可直接操作線程對(duì)象(oc),程序員管理生命周期。

Gcd:c語言,旨在替代nsthread,充分利用設(shè)備多核。自動(dòng)管理線程的生命周期。

Nsopreation: oc語言的,基于gcd,底層是gcd,比gcd多了一些簡(jiǎn)單實(shí)用的功能,使用更加面向?qū)ο?/p>

11.線程的狀態(tài)

控制線程的狀態(tài)

1.啟動(dòng)線程

-(void)start進(jìn)入就緒狀態(tài)—》運(yùn)行狀態(tài)。當(dāng)線程任務(wù)執(zhí)行完畢,自動(dòng)進(jìn)入死亡狀態(tài)

2.阻塞(暫停)線程

+(void)sleepuntiledate:(nsdate*)date

+(void)sleepfortimeinterval:(nstimeinterval)tim;

3.強(qiáng)制停止線程

+(void)exit;

注意:一旦線程停止(死亡)了,就不能再次開啟任務(wù)。

12.多線程的安全隱患

1.資源共享

一塊資源可能會(huì)被多個(gè)線程共享,也就是多個(gè)線程可能會(huì)訪問同一塊資源,比如多個(gè)線程訪問同一個(gè)對(duì)象,同一個(gè)變量,同一個(gè)文件。

當(dāng)多個(gè)線程訪問同一塊資源的時(shí)候,容易引發(fā)數(shù)據(jù)錯(cuò)亂和數(shù)據(jù)安全的問題。

安全隱患解決:互斥鎖

互斥鎖的使用格式:

1.synchronize鎖

注意:鎖定一份代碼只用一把鎖,用多把鎖是無效的。

互斥鎖的優(yōu)缺點(diǎn):

優(yōu)點(diǎn):能夠有效防止因多線程搶奪資源造成的數(shù)據(jù)安全問題

缺點(diǎn):需要消耗大量的CPU資源

互斥鎖的使用前提:多條線程搶奪同一資源。

線程同步:意思是多條線程在同一條線上執(zhí)行(按順序的執(zhí)行任務(wù))

13.原子和非原子屬性的選擇

nonatomic和atomic

atomic:原子屬性,為setter方法加鎖,默認(rèn)是atomic

nonatomic:非原子屬性,不會(huì)為setter方法加鎖。

Atomic:線程安全,需要消耗大量的資源

Nonatomic:非線程安全,適合內(nèi)存小的移動(dòng)設(shè)備

iOS開發(fā)建議:所有的屬性聲明為Nonatomic屬性,盡量避免多線程搶奪同一資源,盡量將加鎖,資源搶奪的業(yè)務(wù)邏輯交給服務(wù)器端處理,減少移動(dòng)端的壓力。

14.線程之間的通信

什么叫線程間通信:在一個(gè)進(jìn)程中,線程往往不是孤立存在的,多個(gè)線程之間需要經(jīng)常進(jìn)行通信。

線程間通信的體現(xiàn):

一個(gè)線程傳遞數(shù)據(jù)給另一個(gè)線程

在一個(gè)線程中執(zhí)行完特定的任務(wù)后,轉(zhuǎn)到另一個(gè)線程繼續(xù)執(zhí)行任務(wù)。

線程間通信常用的方法:


1.


2.


3.

15.GCD

GCD是蘋果公司為多核的并行運(yùn)算提出的解決方案。GCD會(huì)自動(dòng)利用更多的CPU內(nèi)核。GCD會(huì)自動(dòng)管理線程的生命周期(創(chuàng)建線程,調(diào)度任務(wù),銷毀線程)

15.1任務(wù)和隊(duì)列

任務(wù):執(zhí)行什么操作

隊(duì)列:用來存放任務(wù)的

使用步驟:定制任務(wù)---將任務(wù)添加到隊(duì)列中

gcd會(huì)自動(dòng)將隊(duì)列中的任務(wù)取出,放倒對(duì)應(yīng)的隊(duì)列中

任務(wù)的取出遵循隊(duì)列的FIFO原則,先進(jìn)先出,后進(jìn)后出

15.2執(zhí)行任務(wù)

GCD中有兩個(gè)用來執(zhí)行任務(wù)的常用函數(shù)

1.用同步的方式執(zhí)行任務(wù)


4.

2.用異步的方式執(zhí)行函數(shù)


5.

同步和異步的區(qū)別:

同步:只能在當(dāng)前線程中執(zhí)行任務(wù),不具備開啟新的線程的能力

異步:可以在新的線程中執(zhí)行任務(wù),具備開啟新線程的能力

15.3隊(duì)列的類型

1.并發(fā)隊(duì)列:可以讓多個(gè)任務(wù)并發(fā)執(zhí)行。并發(fā)功能只有在異步(dispatch_async)下才有效

2.串行隊(duì)列:讓任務(wù)一個(gè)接著一個(gè)的執(zhí)行,一個(gè)任務(wù)執(zhí)行完畢后,再執(zhí)行下一個(gè)任務(wù)

6.


7.


8.
9.
10.

兩種,創(chuàng)建隊(duì)列的方法


11.

并發(fā)任務(wù)中創(chuàng)建的線程并不是有幾個(gè)任務(wù)創(chuàng)建幾個(gè)線程。要看系統(tǒng)

16.GCD中的并發(fā)隊(duì)列

使用dispatch_queue_creat創(chuàng)建函數(shù)隊(duì)列

12.
13.

16.主隊(duì)列

14.

17.同步和異步


15.

同步和主隊(duì)列:產(chǎn)生死鎖

16,

17.GCD實(shí)現(xiàn)線程間的通信


17.

18.GCD的常用函數(shù)

1.延遲執(zhí)行(三種方法)


18.

2.一次性代碼

一次性代碼不能用在懶加載中。應(yīng)用場(chǎng)景:主要用在單例模式中

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容