多線程與網(wǎng)絡(luò)

簡介

一個(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博客地址--地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末稚叹,一起剝皮案震驚了整個(gè)濱河市焰薄,隨后出現(xiàn)的幾起案子拿诸,更是在濱河造成了極大的恐慌扒袖,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件亩码,死亡現(xiàn)場離奇詭異季率,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)描沟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門飒泻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人吏廉,你說我怎么就攤上這事泞遗。” “怎么了席覆?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵史辙,是天一觀的道長。 經(jīng)常有香客問我,道長聊倔,這世上最難降的妖魔是什么晦毙? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮耙蔑,結(jié)果婚禮上见妒,老公的妹妹穿的比我還像新娘。我一直安慰自己甸陌,他們只是感情好须揣,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著钱豁,像睡著了一般返敬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上寥院,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天劲赠,我揣著相機(jī)與錄音,去河邊找鬼秸谢。 笑死凛澎,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的估蹄。 我是一名探鬼主播塑煎,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼臭蚁!你這毒婦竟也來了最铁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤垮兑,失蹤者是張志新(化名)和其女友劉穎冷尉,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體系枪,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡雀哨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了私爷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雾棺。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖衬浑,靈堂內(nèi)的尸體忽然破棺而出捌浩,到底是詐尸還是另有隱情,我是刑警寧澤工秩,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布尸饺,位于F島的核電站宏榕,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏侵佃。R本人自食惡果不足惜麻昼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望馋辈。 院中可真熱鬧抚芦,春花似錦、人聲如沸迈螟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽答毫。三九已至褥民,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間洗搂,已是汗流浹背消返。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留耘拇,地道東北人撵颊。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像惫叛,于是被迫代替她去往敵國和親倡勇。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

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

  • 一嘉涌、多線程基礎(chǔ) 基本概念 進(jìn)程進(jìn)程是指在系統(tǒng)中正在運(yùn)行的一個(gè)應(yīng)用程序每個(gè)進(jìn)程之間是獨(dú)立的妻熊,每個(gè)進(jìn)程均運(yùn)行在其專用且...
    AlanGe閱讀 542評(píng)論 0 0
  • 在這篇文章中,我將為你整理一下 iOS 開發(fā)中幾種多線程方案仑最,以及其使用方法和注意事項(xiàng)扔役。當(dāng)然也會(huì)給出幾種多線程的案...
    張戰(zhàn)威ican閱讀 601評(píng)論 0 0
  • 聽成績的時(shí)候一定要用右耳法严,因?yàn)樽蠖x心臟近,可能會(huì)猝死葫笼。 小學(xué)6年深啤,初中3年,高中3年路星,只為了參加那一場叫做“高考...
    縵華纓閱讀 353評(píng)論 0 0
  • 在Android開發(fā)中溯街,常采用 MVC(Model-View-Controller)或者M(jìn)VP(Model-Vie...
    andChen閱讀 8,590評(píng)論 6 39
  • 年少時(shí)犯下的錯(cuò)呈昔,總是會(huì)如影如隨的出現(xiàn)在我的睡夢中挥等,似噩夢般與我糾纏不清,卻是一次又一次的提醒著我不要忘記那年夏天留...
    阿俊xi閱讀 228評(píng)論 0 1