iOS多線程介紹
一、前言部分
最近在面試,重新溫習(xí)了一遍多線程,希望加深一遍對(duì)于多線程的理解。
1、什么是進(jìn)程?
1).要了解線程我們必須先了解進(jìn)程,通俗來(lái)講進(jìn)程就是在系統(tǒng)中運(yùn)行的一個(gè)應(yīng)用程序。
2).每個(gè)線程之間是獨(dú)立存在的,分別運(yùn)行在其專用的且受保護(hù)的內(nèi)存空間中。
3).比如打開(kāi)QQ或Xcode系統(tǒng)會(huì)分別開(kāi)啟兩個(gè)進(jìn)程 如圖:
4)、我們可以通過(guò)"活動(dòng)監(jiān)視器"查看Mac系統(tǒng)中所開(kāi)啟的進(jìn)程。
2、什么是線程?
1).一個(gè)進(jìn)程要想執(zhí)行任務(wù)必須得有線程,即一個(gè)進(jìn)程至少要有一個(gè)線程。
2).線程是進(jìn)程的基本執(zhí)行單元,一個(gè)進(jìn)程(程序)的所有任務(wù)都是在線程中執(zhí)行的。
3).比如使用酷狗播放音樂(lè)、使用迅雷下載電影都需要在線程中運(yùn)行 如圖:
3、什么是線程的串行?
1).一個(gè)線程中任務(wù)是串行執(zhí)行的(順序執(zhí)行)的,也就是說(shuō)一個(gè)線程同一時(shí)間內(nèi)只能執(zhí)行一個(gè)任務(wù)。
2).串行執(zhí)行圖解,比如一個(gè)線程下載3個(gè)文件(文件A、B、C)
4、什么是多線程?
1).一個(gè)進(jìn)程中可以開(kāi)啟多個(gè)線程,每個(gè)線程可以并發(fā)(同時(shí))執(zhí)行不同的任務(wù)。
2).類似關(guān)系列舉:進(jìn)程---->車間;線程---->車間工人
3).多線程圖解,比如同時(shí)開(kāi)啟3個(gè)線程分別下載3個(gè)文件(文件A、B、C)
5、多線程原理
1).同一時(shí)間CPU只能執(zhí)行一個(gè)線程,只有一個(gè)線程在工作(執(zhí)行)。
2).多線程并發(fā)(同時(shí))執(zhí)行,其實(shí)是CPU快速的在多個(gè)線程之間調(diào)度(切換)。
3).如果CPU調(diào)度線程的速度夠快,就會(huì)造成多線程并發(fā)執(zhí)行的假象。
4).多線程的缺點(diǎn):
1、每個(gè)線程都會(huì)占用一定的內(nèi)存空間(默認(rèn)情況下:主線程占用1MB,子線程占用512KB),
如果開(kāi)啟線程過(guò)多會(huì)占用大量的內(nèi)存空間因而造成程序性能降低。
2、線程越多CPU調(diào)度線程上的開(kāi)銷就越大(類似工廠工人越多,工廠開(kāi)銷也越大)。
3、使程序設(shè)計(jì)更復(fù)雜:比如多線程的數(shù)據(jù)通信,多線程之間的數(shù)據(jù)共享。
5).多線程的優(yōu)點(diǎn):
1、能適當(dāng)提高程序的執(zhí)行效率。
2、能適當(dāng)提高資源利用率(CPU、內(nèi)存的利用率)
6、什么是主線程?
1).一個(gè)iOS程序開(kāi)啟后默認(rèn)會(huì)開(kāi)啟一個(gè)線程,這個(gè)線程被稱為"主線程"或"UI線程"。
2).主線程的主要作用:
1、顯示/刷新UI界面
2、處理UI事件(比如點(diǎn)擊事件、滾動(dòng)事件、拖拽事件等)
3).主線程注意點(diǎn):
1、別將耗時(shí)的操作放在主線程中,耗時(shí)操作放在主線程中會(huì)造成程序卡頓的問(wèn)題。
7、耗時(shí)操作Demo演示
1)、直接在主線程中運(yùn)行的Demo
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ //獲取當(dāng)前執(zhí)行方法和當(dāng)前線程 //number== 主線程 //number!= 其他線程、子線程、次線程 NSLog(@"%s----%@",__func__,[NSThread currentThread]); //直接在主線程中運(yùn)行 造成UI操作卡頓 [self longTimeOperation]; } #pragma mark-耗時(shí)操作 -(void)longTimeOperation{ for (int i=; i<; i++) { NSLog(@"%d",i); } }
2)、在子線程中運(yùn)行的Demo
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ //獲取當(dāng)前執(zhí)行方法和當(dāng)前線程 //number== 主線程 //number!= 其他線程、子線程、次線程 NSLog(@"%s----%@",__func__,[NSThread currentThread]); //將耗時(shí)操作放在子線程中執(zhí)行,不影響UI的操作 [self performSelectorInBackground:@selector(longTimeOperation) withObject:nil]; } #pragma mark-耗時(shí)操作 -(void)longTimeOperation{ for (int i=; i<; i++) { NSLog(@"%d",i); } }
以上內(nèi)容是小編給大家介紹的ios多線程知識(shí),希望對(duì)大家有所幫助!
- iOS 如何高效的使用多線程
- iOS開(kāi)發(fā)中多線程的安全隱患總結(jié)
- iOS中的多線程如何按設(shè)定順序去執(zhí)行任務(wù)詳解
- IOS多線程編程N(yùn)SThread的使用方法
- iOS 多線程總結(jié)之GCD的使用詳解
- 詳解iOS 多線程 鎖 互斥 同步
- 詳解iOS多線程GCD問(wèn)題
- iOS開(kāi)發(fā)網(wǎng)絡(luò)篇—實(shí)現(xiàn)大文件的多線程斷點(diǎn)下載
- IOS 多線程GCD詳解
- iOS多線程開(kāi)發(fā)——NSThread淺析
- IOS多線程實(shí)現(xiàn)多圖片下載(一)
- IOS多線程實(shí)現(xiàn)多圖片下載(二)
- IOS開(kāi)發(fā)之多線程N(yùn)SThiread GCD NSOperation Runloop
相關(guān)文章
Java List移除相應(yīng)元素的超簡(jiǎn)潔寫法分享
這篇文章主要介紹了Java List移除相應(yīng)元素的超簡(jiǎn)潔寫法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11SpringBoot如何通過(guò)Feign調(diào)用傳遞Header中參數(shù)
這篇文章主要介紹了SpringBoot通過(guò)Feign調(diào)用傳遞Header中參數(shù),本文給大家分享兩種解決方案給大家詳細(xì)講解,需要的朋友可以參考下2023-04-04Mybatis的@select和@SelectProvider注解方式動(dòng)態(tài)SQL語(yǔ)句解讀
這篇文章主要介紹了Mybatis的@select和@SelectProvider注解方式動(dòng)態(tài)SQL語(yǔ)句,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12解決feignclient調(diào)用服務(wù),傳遞的中文數(shù)據(jù)成???問(wèn)題
這篇文章主要介紹了解決feignclient調(diào)用服務(wù),傳遞的中文數(shù)據(jù)成???問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01淺談SpringBoot Bean加載優(yōu)先級(jí)的問(wèn)題
這篇文章主要介紹了淺談SpringBoot Bean加載優(yōu)先級(jí)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11