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ù)安全的問題。
安全隱患解決:互斥鎖
互斥鎖的使用格式:

注意:鎖定一份代碼只用一把鎖,用多把鎖是無效的。
互斥鎖的優(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ù)。
線程間通信常用的方法:



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ù)

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

同步和異步的區(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ù)





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

并發(fā)任務(wù)中創(chuàng)建的線程并不是有幾個(gè)任務(wù)創(chuàng)建幾個(gè)線程。要看系統(tǒng)
16.GCD中的并發(fā)隊(duì)列
使用dispatch_queue_creat創(chuàng)建函數(shù)隊(duì)列


16.主隊(duì)列

17.同步和異步

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

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

18.GCD的常用函數(shù)
1.延遲執(zhí)行(三種方法)

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