iOS開(kāi)發(fā)之多線程N(yùn)SThread

線程是用來(lái)執(zhí)行任務(wù)的,線程徹底執(zhí)行完任務(wù)A才能去執(zhí)行任務(wù)B。為了同時(shí)執(zhí)行兩個(gè)任務(wù),產(chǎn)生了多線程。我打開(kāi)一個(gè)視頻軟件,我開(kāi)辟一個(gè)線程A讓它執(zhí)行下載任務(wù),我開(kāi)辟一個(gè)線程B,用來(lái)播放視頻。我開(kāi)辟兩個(gè)線程后,這兩個(gè)任務(wù)能同時(shí)執(zhí)行,如果我開(kāi)辟一個(gè)線程,只有下載任務(wù)完成,才能去執(zhí)行播放任務(wù)。

線程相當(dāng)于店里的服務(wù)員,一個(gè)服務(wù)員同時(shí)只能做一件事情,多顧幾個(gè)服務(wù)員,就能同時(shí)做很多事情。

1.多線程:用來(lái)執(zhí)行任務(wù),線程徹底執(zhí)行完任務(wù)A才能去執(zhí)行任務(wù)B。為了同時(shí)執(zhí)行兩個(gè)任務(wù),產(chǎn)生了多個(gè)線程

2.進(jìn)程:操作系統(tǒng)中運(yùn)行的程序 專(zhuān)業(yè)的講,應(yīng)用程序的執(zhí)行實(shí)例 不能執(zhí)行任務(wù) 進(jìn)程在運(yùn)行時(shí)候創(chuàng)建的資源隨著進(jìn)程的終止而死亡 進(jìn)程里面可以包含多個(gè)線程

3.線程:線程是進(jìn)程內(nèi)部的一個(gè)獨(dú)立的執(zhí)行單元 一個(gè)線程同時(shí)只能執(zhí)行一個(gè)任務(wù) 包含主線程(用戶(hù)界面線程)和子線程(工作線程或后臺(tái)線程) 線程執(zhí)行完畢就會(huì)銷(xiāo)毀

主線程:當(dāng)應(yīng)用程序啟動(dòng)時(shí)自動(dòng)創(chuàng)建和啟動(dòng),通常用來(lái)處理用戶(hù)的輸入并響應(yīng)各種事件和消息 主線程的終止意味著該程序的結(jié)束

子線程:有主線程來(lái)創(chuàng)建,用來(lái)幫助主線程執(zhí)行程序的后臺(tái)處理任務(wù),如果子線程A中創(chuàng)建了一個(gè)子線程B,在創(chuàng)建之后兩者是相互獨(dú)立的,多個(gè)子線程之間效果上是可以同時(shí)執(zhí)行

多線程:

①目前大多數(shù)的app,都需要連接服務(wù)器,而訪問(wèn)服務(wù)器的速度可能快也可能很慢。如果一個(gè)app訪問(wèn)服務(wù)器的操作沒(méi)有在子線程操作的話,在該app訪問(wèn)服務(wù)器的過(guò)程中,該軟件是不能響應(yīng)用 戶(hù)的操作的,只有該app訪問(wèn)結(jié)束以后,app才能響應(yīng)用戶(hù)的操作,這就造成線程阻塞,也就是我們常見(jiàn)的卡頓現(xiàn)象。一條線程在同一時(shí)間內(nèi)只能執(zhí)行一個(gè)任務(wù),但是進(jìn)程可以有多條線程。可以開(kāi)啟多條線程來(lái)執(zhí)行不同的任務(wù),從而提高程序的執(zhí)行效率,避免線程阻塞。

② 每個(gè)線程都可以設(shè)置優(yōu)先級(jí),操作系統(tǒng)會(huì)根據(jù)線程的優(yōu)先級(jí)來(lái)安排CPU的時(shí)間,優(yōu)先級(jí)高的線程,優(yōu)先調(diào)用的幾率會(huì)更大,同級(jí)的話,執(zhí)行的先后對(duì)線程執(zhí)行的先后有影響

③ 同一時(shí)間內(nèi),CPU只能處理一條線程,只有一條線程在工作。多線程并行執(zhí)行,其實(shí)就是各個(gè)線程不斷切換,因?yàn)閳?zhí)行切換的時(shí)間很快很快,就造成了同時(shí)執(zhí)行的假象,原理如下,比如A,B兩個(gè)線程;

(1)A執(zhí)行到某一時(shí)間段要切換了,可A任務(wù)沒(méi)完成,系統(tǒng)就會(huì)把A當(dāng)前執(zhí)行的位置和數(shù)據(jù)以入棧的方式保存起來(lái)

(2)然后B線程執(zhí)行,B執(zhí)行時(shí)間到了,它的位置狀態(tài)等也會(huì)被系統(tǒng)保存到B的棧中。

(3)系統(tǒng)自動(dòng)找到A的棧,將A之前保存的數(shù)據(jù)恢復(fù),又可以從A之前斷開(kāi)的狀態(tài)繼續(xù)執(zhí)行下去,如此循環(huán)

(4) 系統(tǒng)每開(kāi)一個(gè)線程都有比較大的開(kāi)銷(xiāo),若線程開(kāi)的過(guò)多,不僅會(huì)占用大量?jī)?nèi)存和讓城鄉(xiāng)變得更加復(fù)雜,而且會(huì)加重CPU的負(fù)擔(dān),這樣的軟件,會(huì)讓你省掉冬天買(mǎi)暖手寶的錢(qián)。

4.一個(gè)進(jìn)程可以有多個(gè)線程,并且所有線程都在該進(jìn)程的虛擬地址空間中,可以使用進(jìn)程的全局變和系統(tǒng)資源

5. 多線程的優(yōu)勢(shì)

①提高程序執(zhí)行效率,避免線程阻塞造成的卡頓現(xiàn)象

②能適當(dāng)提高資源利用率(CPU,內(nèi)存)

6. 多線程的不足

①開(kāi)啟線程需要占用一定的內(nèi)存空間

②線程越多,CPU在線程調(diào)度上的開(kāi)銷(xiāo)就越大

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

線程與進(jìn)程的關(guān)系

線程是CPU執(zhí)行任務(wù)的基本單位,一個(gè)進(jìn)程可以有多個(gè)線程,但同時(shí)只能執(zhí)行一個(gè)任務(wù)。

進(jìn)程就是運(yùn)行中的軟件,是動(dòng)態(tài)的。

一個(gè)操作系統(tǒng)可以對(duì)應(yīng)多個(gè)進(jìn)程,一個(gè)進(jìn)程可以有多條線程,但至少有一個(gè)線程

同一個(gè)進(jìn)程內(nèi)的線程共享進(jìn)程里的資源

主線程

進(jìn)程一啟動(dòng)就自動(dòng)創(chuàng)建

顯示和刷新UI界面

處理UI事件

子線程的作用

處理耗時(shí)的操作

子線程不能用來(lái)刷新UI

使用NSOperation和NSOperationQueue進(jìn)行多線程開(kāi)發(fā)類(lèi)似于線程池,只要將一個(gè)NSOperation(實(shí)際開(kāi)發(fā)中需要使用其子類(lèi)NSInvocationOperation、NSBlockOperation)放到NSOperationQueue這個(gè)隊(duì)列中線程就會(huì)依次啟動(dòng)。NSOperationQueue負(fù)責(zé)管理、執(zhí)行所有的NSOperation,在這個(gè)過(guò)程中可以更加容易管理線程總數(shù)和控制線程之間的依賴(lài)關(guān)系。

NSOperation有兩常用子類(lèi)用于創(chuàng)建線程操作:NSInvocationOperation和NSBlockOperation,兩種方式本質(zhì)沒(méi)有區(qū)別,但后者使用block形式進(jìn)行代碼組織,使用相對(duì)方便。

GCD是基于C語(yǔ)言開(kāi)發(fā)的一套多線程開(kāi)發(fā)機(jī)制,也是目前蘋(píng)果官網(wǎng)推薦的多線程開(kāi)發(fā)方法。

GCD會(huì)自動(dòng)管理線程的生命周期(創(chuàng)建線程、調(diào)度任務(wù)、銷(xiāo)毀線程),程序員只需要告訴GCD想要執(zhí)行什么任務(wù),不需要編寫(xiě)任何線程管理代碼

GCD是這三種多線程開(kāi)發(fā)方式中抽象層次最高的,使用起來(lái)也是最為方便的,只是基于C語(yǔ)言開(kāi)發(fā),并不像前兩種是面向?qū)ο箝_(kāi)發(fā),而是完全面向過(guò)程的。這種機(jī)制相比較于前面兩種多線程開(kāi)發(fā)方式最顯著的優(yōu)點(diǎn)就是它對(duì)于多核運(yùn)算更加有效,會(huì)自動(dòng)利用更多的CPU內(nèi)核(比如雙核、四核)。

GCD中也有一個(gè)類(lèi)似于NSOperationQueue的隊(duì)列,GCD統(tǒng)一管理整個(gè)隊(duì)列中的任務(wù)。但是GCD中的隊(duì)列分為并行隊(duì)列和串行隊(duì)列兩類(lèi):

1、串行隊(duì)列:只有一個(gè)線程,加入到隊(duì)列中的操作按添加順序依次執(zhí)行。

2、并發(fā)隊(duì)列:有多個(gè)線程,操作進(jìn)來(lái)以后他會(huì)將這些線程安排在可用的處理器上,同時(shí)保證先進(jìn)來(lái)的任務(wù)優(yōu)先處理。

其實(shí)在GCD中還有一個(gè)特殊隊(duì)列就是主隊(duì)列,用來(lái)執(zhí)行主線程上的操作任務(wù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 一、多線程N(yùn)SThread 1.多線程基礎(chǔ)知識(shí) 線程與進(jìn)程的關(guān)系(1). 線程是CPU執(zhí)行任務(wù)的基本單位,一個(gè)進(jìn)程...
    IOS_龍閱讀 601評(píng)論 0 8
  • Object C中創(chuàng)建線程的方法是什么?如果在主線程中執(zhí)行代碼,方法是什么?如果想延時(shí)執(zhí)行代碼、方法又是什么? 1...
    AlanGe閱讀 1,793評(píng)論 0 17
  • 進(jìn)程和線程 首先,在了解多線程之前要了解什么是進(jìn)程,什么是線程 什么是進(jìn)程呢?進(jìn)程是指在系統(tǒng)中正在運(yùn)行的一個(gè)應(yīng)用程...
    擱淺的青蛙閱讀 408評(píng)論 0 0
  • .一.進(jìn)程 進(jìn)程:是指在系統(tǒng)中正在運(yùn)行的一個(gè)應(yīng)用程序,每個(gè)進(jìn)程之間是獨(dú)立的,每個(gè)進(jìn)程均運(yùn)行在其專(zhuān)用且受保護(hù)的內(nèi)存空...
    IIronMan閱讀 4,527評(píng)論 1 33