多線程簡單介紹

一、進程和線程

1.什么是進程

進程是指在系統(tǒng)中正在運行的一個應(yīng)用程序

每個進程之間是獨立的,每個進程均運行在其專用且受保護的內(nèi)存空間內(nèi)

比如同時打開QQ、Xcode,系統(tǒng)就會分別啟動2個進程

通過“活動監(jiān)視器”可以查看Mac系統(tǒng)中所開啟的進程

2.什么是線程

1個進程要想執(zhí)行任務(wù),必須得有線程(每1個進程至少要有1條線程)

線程是進程的基本執(zhí)行單元,一個進程(程序)的所有任務(wù)都在線程中執(zhí)行

比如使用酷狗播放音樂、使用迅雷下載電影,都需要在線程中執(zhí)行

3.線程的串行

1個線程中任務(wù)的執(zhí)行是串行的

如果要在1個線程中執(zhí)行多個任務(wù),那么只能一個一個地按順序執(zhí)行這些任務(wù)

也就是說,在同一時間內(nèi),1個線程只能執(zhí)行1個任務(wù)

比如在1個線程中下載3個文件(分別是文件A、文件B、文件C)

二、多線程

1.什么是多線程

1個進程中可以開啟多條線程,每條線程可以并行(同時)執(zhí)行不同的任務(wù)

進程?->車間,線程->車間工人

多線程技術(shù)可以提高程序的執(zhí)行效率

比如同時開啟3條線程分別下載3個文件(分別是文件A、文件B、文件C)

2.多線程的原理

同一時間,CPU只能處理1條線程,只有1條線程在工作(執(zhí)行)

多線程并發(fā)(同時)執(zhí)行,其實是CPU快速地在多條線程之間調(diào)度(切換)

如果CPU調(diào)度線程的時間足夠快,就造成了多線程并發(fā)執(zhí)行的假象

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

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

每條線程被調(diào)度執(zhí)行的頻次會降低(線程的執(zhí)行效率降低)

3.多線程的優(yōu)缺點

多線程的優(yōu)點

能適當提高程序的執(zhí)行效率

能適當提高資源利用率(CPU、內(nèi)存利用率)

多線程的缺點

開啟線程需要占用一定的內(nèi)存空間(默認情況下,主線程占用1M,子線程占用512KB),如果開啟大量的線程,會占用大量的內(nèi)存空間,降低程序的性能

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

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

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

主線程:一個iOS程序運行后,默認會開啟1條線程,稱為“主線程”或“UI線程”

主線程的主要作用

顯示\刷新UI界面

處理UI事件(比如點擊事件、滾動事件、拖拽事件等)

主線程的使用注意:別將比較耗時的操作放到主線程中。

耗時操作會卡住主線程,嚴重影響UI的流暢度,給用戶一種“卡”的壞體驗

5.代碼示例


YYViewController.m

01-阻塞主線程

#import"YYViewController.h"

@interfaceYYViewController ()

-(IBAction)btnClick;

@end

@implementationYYViewController

- (void)viewDidLoad

{

[super viewDidLoad];

}

//按鈕的點擊事件

-(IBAction)btnClick {

1.獲取當前線程

NSThread *current=[NSThread currentThread];

2.使用for循環(huán)執(zhí)行一些耗時操作

for(inti=0; i<10000; i++) {

//3.輸出線程

NSLog(@"btnClick---%d---%@",i,current);

}

}

@end

執(zhí)行效果:

說明:當點擊執(zhí)行的時候,textView點擊無響應(yīng)。

執(zhí)行分析:等待主線程串行執(zhí)行。

開啟子線程。

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

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