簡介
一個(gè)必不可少的知識(shí),時(shí)間久了,一位小伙伴遇到疑問時(shí),我竟然解答混淆了,當(dāng)然重寫溫習(xí)一下,不管是新知識(shí)也好,基本概念也好,知識(shí)就是在不斷的咀嚼中不斷理解,于是寫了一篇對(duì)應(yīng)多線程和網(wǎng)絡(luò)自己的理解,有理解不恰當(dāng)?shù)牡胤?請(qǐng)?zhí)岢?謝謝大家
多線程概念
1.異步與同步
異步:多個(gè)任務(wù)操作可以同時(shí)執(zhí)行適應(yīng)傳輸數(shù)據(jù)量大,在連接過程中UI不“凍結(jié)”;<大量線程CPU超限的話會(huì)造成一種假死的狀態(tài)(造成卡,但是線程還在后臺(tái)執(zhí)行)>
同步:代碼從上到下,按順序依次一步一步的執(zhí)行,當(dāng)請(qǐng)求的數(shù)據(jù)量小時(shí)躺坟,同步連接是一個(gè)很好的選擇。UI“凍結(jié)”是它的一個(gè)缺點(diǎn)罩缴。
2.進(jìn)程與線程
進(jìn)程:進(jìn)程是系統(tǒng)中正在運(yùn)行的一個(gè)程序,每一個(gè)進(jìn)程都是獨(dú)立的,都運(yùn)行在其專用且受保護(hù)的內(nèi)存空間內(nèi),通過活動(dòng)監(jiān)視器可以查看mac系統(tǒng)中所有開啟的進(jìn)程
線程:線程是進(jìn)程的基本執(zhí)行單元,進(jìn)程的所有任務(wù)都在線程中執(zhí)行,一個(gè)進(jìn)程至少要有一條線程,當(dāng)程序啟動(dòng)時(shí)會(huì)默認(rèn)開啟一條線程,這條線程被稱為主線程或者UI線程
3.之間關(guān)系
一個(gè)進(jìn)程可以開啟多條線程,每一條線程都可以執(zhí)行不同的任務(wù)
進(jìn)程--->小工廠
線程--->員工
主線程--->老板
多線程技術(shù)可以提升程序執(zhí)行的效率
4.主線程
程序啟動(dòng)創(chuàng)建的線程被稱為主線程
作用:顯示/刷新UI界面;處理UI事件:點(diǎn)擊\滾動(dòng)\拖拽等事件
注意:要將耗時(shí)操作放在后臺(tái)執(zhí)行,否則會(huì)影響UI的流暢度,破壞用戶體驗(yàn);所有的網(wǎng)絡(luò)訪問都是耗時(shí)操作
多線程原理
1.使用多線程目的:將耗時(shí)操作放在后臺(tái)去執(zhí)行,待執(zhí)行完成后,通知主線程更新UI
2.原理:
單核CPU:同一時(shí)間,CPU只能處理一個(gè)線程,換而言之,在同一時(shí)間內(nèi)只有一個(gè)線程在執(zhí)行
多線程同時(shí)執(zhí)行:CPU快速的在多個(gè)線程間的切換;CPU調(diào)度線程的時(shí)間足夠快,就造成了多線程同時(shí)執(zhí)行的效果
如果線程非常多的時(shí)候:CPU會(huì)在N個(gè)線程之間切換,消耗大量的CPU資源,每一條線程調(diào)度的次數(shù)會(huì)降低,線程的執(zhí)行效率也會(huì)降低
3.多線程的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):可以適當(dāng)提高程序的執(zhí)行效率;提高資源的利用率(CPU,內(nèi)存)
缺點(diǎn):開啟線程需要占用一定的內(nèi)存空間(默認(rèn)情況下,每一條線程都占512KB--iOS8.0后主線程默認(rèn)的堆棧也是512KB)
如果開啟大量的線程,會(huì)占用大量的空間,降低程序的性能,那么CPU在調(diào)度線程上的開銷就越大
線程是程序邏輯思維更為復(fù)雜;比如線程間的通訊及多線程的數(shù)據(jù)共享
4.多線程的實(shí)現(xiàn)方案
pthread演練?
1.基本概念
pthread是POSIX多線程開發(fā)框架,是跨平臺(tái)的C語言框架,在蘋果的頭文件中并沒有太多的注釋
2.演練
// 創(chuàng)建線程,并且在線程中執(zhí)行 demo 函數(shù)
- (void)pthreadDemo {
/**? ? 參數(shù): ?
?1> 指向線程標(biāo)識(shí)符的指針层扶,C 語言中類型的結(jié)尾通常 _t/Ref箫章,而且不需要使用 * ? ?
?2> 用來設(shè)置線程屬性? ??
?3> 新建立的線程執(zhí)行代碼的函數(shù)? ?
?4> 運(yùn)行函數(shù)的參數(shù)? ? 返回值:? ? - 若線程創(chuàng)建成功,則返回0? ? - 若線程創(chuàng)建失敗镜会,則返回出錯(cuò)編號(hào)? ? */? ?
? ? ?pthread_t threadId =NULL;
? ? NSString *str =@"Hello Pthread";
? ? int result = pthread_create(&threadId,NULL, demo, (__bridgevoid *)(str));
? ? if (result ==0) {
? ? ? ? ? ? ?NSLog(@"創(chuàng)建線程 OK");? ?
? ? }else {
? ? ? ? ? ? NSLog(@"創(chuàng)建線程失敗 %d", result);? ?
? ? }
}
// 后臺(tái)線程調(diào)用函數(shù)
void *demo(void *params) {
? ? ? NSString *str = (__bridgeNSString *)(params);
? ? ? NSLog(@"%@ - %@", [NSThread ? ? ?currentThread], str);returnNULL;
}
小結(jié):
在C語言中并沒有對(duì)象的概念,對(duì)象是以結(jié)構(gòu)體的方式來實(shí)現(xiàn)的;C語言中的void*和OC中的id是等價(jià)的;混合開發(fā)時(shí),如果在C和OC之間進(jìn)行數(shù)據(jù)傳遞,需要用_bridge進(jìn)行橋接,橋接的目的是為了告訴編譯器如何管理內(nèi)存
NSThread演練
三種創(chuàng)建方式
NSThread的對(duì)象方法
- (void)threadDemo1 {
? ? NSLog(@"before %@", [NSThread currentThread]);
? ?NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(longOperation:) object:@"THREAD"];? ??
? ?[thread start];
NSLog(@"after %@", [NSThread currentThread]);}
小結(jié):在start方法執(zhí)行完畢后,會(huì)在另一個(gè)線程執(zhí)longOperation:方法
NSThread的類方法
- (void)threadDemo2 {
? ? NSLog(@"before %@", [NSThread currentThread]);??
? ? [NSThread detachNewThreadSelector:@selector(longOperation:) toTarget:self withObject:@"DETACH"];
? ?NSLog(@"after %@", [NSThread currentThread]);
}
小結(jié):detachNewThreadSelector:類方法不需要啟動(dòng);會(huì)自動(dòng)創(chuàng)建線程并執(zhí)行@selector方法
NSThread的類方法
- (void)threadDemo3 {
? NSLog(@"before %@", [NSThread currentThread]);? ?
? [self performSelectorInBackground:@selector(longOperation:) withObject:@"PERFORM"];
? NSLog(@"after %@", [NSThread currentThread]);
}
小結(jié):這是NSObject的分類方法,會(huì)在后臺(tái)自動(dòng)執(zhí)行@selector方法;
線程的狀態(tài)
狀態(tài)說明
a.新建
實(shí)例化線程對(duì)象
b.就緒
向線程對(duì)象發(fā)送start消息,線程對(duì)象被加入可調(diào)度線程池等待CPU調(diào)度;detach方法和performSelectorInBackGround方法會(huì)直接實(shí)例化一個(gè)線程對(duì)象并加入可調(diào)度線程池
c.運(yùn)行
CPU負(fù)責(zé)調(diào)度可調(diào)度線程池中的任務(wù)執(zhí)行
線程執(zhí)行完之前,狀態(tài)可能在就緒和運(yùn)行之間來回切換
d.阻塞
當(dāng)滿足某個(gè)預(yù)定條件時(shí)可以,可以使用休眠或鎖阻塞線程執(zhí)行
sleepForTimeInterval:休眠指定時(shí)長
sleepUntilDate:休眠到指定日期
@synchronized(self):互斥鎖
e.死亡
正常死亡:線程執(zhí)行完畢
非正常死亡:當(dāng)滿足某個(gè)條件時(shí),在線程內(nèi)部終止執(zhí)行;當(dāng)滿足某個(gè)條件時(shí)在主線程終止線程對(duì)象
網(wǎng)絡(luò)的基本概念
1.基本概念
客戶端:client,移動(dòng)應(yīng)用(iOS/android)
服務(wù)器:server,為客戶端提供服務(wù),提供數(shù)據(jù),提供資源的特殊的計(jì)算機(jī)
請(qǐng)求:request,客戶端向服務(wù)器索取數(shù)據(jù)的一種行為
響應(yīng):response,服務(wù)器對(duì)客戶端的請(qǐng)求作出的一系列反應(yīng),一般指返回?cái)?shù)據(jù)給客戶端
網(wǎng)絡(luò)的核心是請(qǐng)求和響應(yīng)!
2.服務(wù)器
為客戶端提供數(shù)據(jù)的特殊計(jì)算機(jī)
按照軟件開發(fā)階段來分,服務(wù)器分為以下兩種
1> 遠(yuǎn)程服務(wù)器:
別名:外網(wǎng)服務(wù)器,正式服務(wù)器
使用階段:應(yīng)用上線后使用的服務(wù)器
使用人群:全體用戶使用
速度:取決于服務(wù)器的性能,用戶的網(wǎng)速
2>本地服務(wù)器
別名:內(nèi)務(wù)服務(wù)器,測試服務(wù)器
使用階段:應(yīng)用處于開發(fā),測試階段使用的服務(wù)器
使用人群:僅供內(nèi)部人員使
速度:由于是局域網(wǎng)檬寂,所以速度飛快,有助于提高開發(fā)測試效率
C博客地址--地址