GCD 線程和進(jìn)程

GCD?

一塞祈、基本概念

全稱是Grand Central Dispath金刁,純C語言,提供非常多強(qiáng)大的函數(shù)议薪,是目前蘋果官網(wǎng)推薦的多線程開發(fā)方式尤蛮,NSOperation便是基于GCD的封裝

二、GCD的優(yōu)勢(shì)所在

1斯议、為多核的并行運(yùn)算提出了解決方案

2产捞、GCD會(huì)自動(dòng)利用更多的CPU內(nèi)核,比如雙核哼御、四核

3坯临、GCD會(huì)自動(dòng)管理線程的生命周期(創(chuàng)建線程、調(diào)度任務(wù)恋昼、銷毀線程)

4看靠、程序員只需要告訴GCD想要執(zhí)行什么任務(wù),不需要編寫任何線程管理代碼

三液肌、GCD中有2個(gè)核心概念

1挟炬、隊(duì)列:用來存放任務(wù)

1)串行隊(duì)列

只有一個(gè)線程,加入到隊(duì)列中的操作按添加順序依次執(zhí)行嗦哆,一個(gè)任務(wù)執(zhí)行完畢后谤祖,才能再執(zhí)行下一個(gè)任務(wù)

2)并發(fā)隊(duì)列

有多個(gè)線程,操作進(jìn)來以后會(huì)將這些線程安排在可用的處理器上吝秕,同時(shí)保證先進(jìn)來的任務(wù)優(yōu)先處理

PS:GCD中還有一個(gè)特殊隊(duì)列就是主隊(duì)列泊脐,用來執(zhí)行主線程的操作任務(wù)

2、任務(wù):放在隊(duì)列中執(zhí)行

1)同步執(zhí)行

只能在當(dāng)前線程中執(zhí)行任務(wù)烁峭,不具備開啟新線程的能力

2)異步執(zhí)行

可以在新的線程中執(zhí)行任務(wù),具備開啟新線程的能力。

四约郁、GCD做多線程開發(fā)可以抽象成兩步

1缩挑、找到隊(duì)列

1)找到更新UI的主線程所在的隊(duì)列

dispatch_queue_t mainQueue= dispatch_get_main_queue();

2) 創(chuàng)建隊(duì)列

dispatch_queue_t serialQueue = dispatch_queue_create("mySerialQueue", DISPATCH_QUEUE_SERIAL);

第一個(gè)參數(shù):隊(duì)列名字

第二個(gè)參數(shù):隊(duì)列類類型

并行隊(duì)列:DISPATCH_QUEUE_CONCURRENT

串行隊(duì)列:DISPATCH_QUEUE_SERIAL

3)系統(tǒng)內(nèi)部給我們提供有一個(gè)現(xiàn)成的并發(fā)全局隊(duì)列

dispatch_queue_t queue = dispatch_get_global_queue(0 , 0);

第一個(gè)參數(shù):線程的優(yōu)先級(jí), DISPATCH_QUEUE_PRIORITY_BACKGROUND是最低的。

第二個(gè)參數(shù):系統(tǒng)保留的參數(shù)鬓梅,永遠(yuǎn)傳0

2供置、在隊(duì)列中確定想做的事

1) 使用同步的方式

dispatch_sync(queue, ^{

});

2)使用異步的方式

dispatch_async(queue, ^{

});

五、GCD創(chuàng)建的線程任務(wù)有四種執(zhí)行方式

1绽快、串行隊(duì)列同步執(zhí)行任務(wù)

dispatch_queue_t serialQueue = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_SERIAL);

dispatch_sync(serialQueue, ^{

NSLog(@"-%@",[NSThread currentThread]);

});

dispatch_sync(serialQueue, ^{

NSLog(@"1 - %@", [NSThread currentThread]);

});

dispatch_sync(serialQueue, ^{

NSLog(@"2 - %@", [NSThread currentThread]);

});

dispatch_sync(serialQueue, ^{

NSLog(@"3 - %@", [NSThread currentThread]);

});

同步不具有開辟新線程的能力芥丧,不會(huì)開辟新的線程去執(zhí)行任務(wù),會(huì)在當(dāng)前線程中順序執(zhí)行任務(wù)坊罢。

2续担、串行隊(duì)列異步執(zhí)行任務(wù)

dispatch_queue_t serialQueue1 = dispatch_queue_create("serialQueue1", DISPATCH_QUEUE_SERIAL);

dispatch_async(serialQueue1, ^{

NSLog(@"1 = %@",[NSThread currentThread]);

});

dispatch_async(serialQueue1, ^{

NSLog(@"2 = %@",[NSThread currentThread]);

});

dispatch_async(serialQueue1, ^{

NSLog(@"3 = %@",[NSThread currentThread]);

});

異步具有創(chuàng)建新線程的能力,會(huì)開辟新的線程去執(zhí)行任務(wù)活孩,但由于是串行物遇,里面只能創(chuàng)建一個(gè)線程,所以還是會(huì)按順序執(zhí)行

3憾儒、并行隊(duì)列同步執(zhí)行任務(wù)

dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrentQueue", DISPATCH_QUEUE_CONCURRENT);

dispatch_sync(concurrentQueue, ^{

NSLog(@"1 = %@",[NSThread currentThread]);

});

dispatch_sync(concurrentQueue, ^{

NSLog(@"2 = %@",[NSThread currentThread]);

});

dispatch_sync(concurrentQueue, ^{

NSLog(@"3 = %@",[NSThread currentThread]);

});

同步不具有創(chuàng)建新線程的能力询兴,不會(huì)開辟新的線程去執(zhí)行任務(wù),會(huì)在當(dāng)前線程去執(zhí)行任務(wù)

4起趾、并發(fā)隊(duì)列異步執(zhí)行任務(wù)(常用)

dispatch_queue_t concurrentQueue1 = dispatch_queue_create("concurrentQueue", DISPATCH_QUEUE_CONCURRENT);

dispatch_async(concurrentQueue1, ^{

NSLog(@"1 = %@",[NSThread currentThread]);

});

dispatch_async(concurrentQueue1, ^{

NSLog(@"2 = %@",[NSThread currentThread]);

});

dispatch_async(concurrentQueue1, ^{

NSLog(@"3 = %@",[NSThread currentThread]);

});

并行隊(duì)列可以里可以有多個(gè)線程诗舰,同步執(zhí)行的方式又可以開辟多個(gè)線程,所以這里實(shí)現(xiàn)了多個(gè)線程并行執(zhí)行,沒有按照順序

六训裆、GCD組的應(yīng)用

GCD中可以將一組相關(guān)聯(lián)的操作始衅,定義到一個(gè)群組中

定義到群組中之后,當(dāng)所有線程完成時(shí)缭保,可以獲得通知

0汛闸、創(chuàng)建全局隊(duì)列

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

1、定義群組

dispatch_group_t group = dispatch_group_create();

2艺骂、定義群組的異步任務(wù)

dispatch_group_async(group, queue, ^{

});

dispatch_group_async(group, queue, ^{

});

3诸老、群組任務(wù)完成通知

dispatch_group_notify(group, queue, ^{

});

1)dispatch_group_notify可以監(jiān)聽一組任務(wù)是否完成。這個(gè)方法很有用钳恕,比如你執(zhí)行三個(gè)下載任務(wù)别伏,當(dāng)三個(gè)任務(wù)都下載完成后,才通知界面說已經(jīng)完成

2)如果不需要監(jiān)聽一組任務(wù)忧额,可以直接使用dispatch_async方法

六厘肮、線程鎖

1、在多線程應(yīng)用中睦番,所有被搶奪資源的屬性需要設(shè)置為原子屬性,atomic屬性类茂,必須與@synchronized(同步鎖)一起使用

2耍属、系統(tǒng)會(huì)在多線程搶奪時(shí),保證該屬性有且僅有一個(gè)線程能夠訪問

3巩检、操作步驟

1)將資源屬性設(shè)置原子屬性

2)將處理該屬性的代碼放到線程鎖中

@synchronized (self) {

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末厚骗,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子兢哭,更是在濱河造成了極大的恐慌领舰,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件迟螺,死亡現(xiàn)場(chǎng)離奇詭異冲秽,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)矩父,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門锉桑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人浙垫,你說我怎么就攤上這事刨仑。” “怎么了夹姥?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵杉武,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我辙售,道長(zhǎng)轻抱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任旦部,我火速辦了婚禮祈搜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘士八。我一直安慰自己容燕,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布婚度。 她就那樣靜靜地躺著蘸秘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蝗茁。 梳的紋絲不亂的頭發(fā)上醋虏,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音哮翘,去河邊找鬼颈嚼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛饭寺,可吹牛的內(nèi)容都是我干的阻课。 我是一名探鬼主播叫挟,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼柑肴!你這毒婦竟也來了霞揉?” 一聲冷哼從身側(cè)響起旬薯,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤晰骑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后绊序,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體硕舆,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年骤公,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了抚官。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡阶捆,死狀恐怖凌节,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情洒试,我是刑警寧澤倍奢,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站垒棋,受9級(jí)特大地震影響卒煞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜叼架,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一畔裕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧乖订,春花似錦扮饶、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蜡吧,卻和暖如春毫蚓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背昔善。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工元潘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人君仆。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓翩概,卻偏偏與公主長(zhǎng)得像牲距,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子钥庇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

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

  • #import "ViewController.h" @interface ViewController () @...
    艾克12138閱讀 211評(píng)論 0 0
  • 文章目錄GCD簡(jiǎn)介任務(wù)和隊(duì)列GCD的使用步驟隊(duì)列的創(chuàng)建方法任務(wù)的創(chuàng)建方法GCD的基本使用并行隊(duì)列 + 同步執(zhí)行并行...
    lusen_b閱讀 244評(píng)論 0 1
  • 一牍鞠、前言 上一篇文章iOS多線程淺匯-原理篇中整理了一些有關(guān)多線程的基本概念。本篇博文介紹的是iOS中常用的幾個(gè)多...
    nuclear閱讀 2,046評(píng)論 6 18
  • 今天同事借我一本書《覺醒的百萬富翁》 慢慢讀理財(cái)書多了嗦枢,不論是羅伯特·清崎在《窮爸爸富爸爸中提到的三個(gè)賬戶:投資攀芯、...
    綠水蕩漾景天然閱讀 686評(píng)論 2 2
  • 趕路的人往終點(diǎn)走著 逾過高山 便以為到了天涯的盡頭 卻哪知,跨過那坎文虏,猶有路遠(yuǎn) 月冷云淡侣诺,蟲訴露寒 憑欄倚窗悵悵過...
    小刀剜月閱讀 186評(píng)論 2 2