多線程GCD的操作

多線程

GCD

?   全稱是Grand Central Dispatch 
?   純C語言岸霹,提供了非常多強(qiáng)大的函數(shù)

執(zhí)行任務(wù)的方式

同步的方式

   dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);
         queue:隊(duì)列
         block:任務(wù)

異步的方式

    dispatch_async(dispatch_queue_t queue, dispatch_block_t block);

隊(duì)列類型

可以分為兩大類
1.并發(fā)隊(duì)列 ? Concurrent Dispatch Queue
? 可以讓多個(gè)任務(wù)并發(fā)(同時(shí))執(zhí)行(自動(dòng)開啟多個(gè)線程同時(shí)執(zhí)行任務(wù))
? 并發(fā)功能只有在異步(dispatch_async)函數(shù)下才有效
2.串行隊(duì)列 ? Serial Dispatch Queue
? 讓任務(wù)一個(gè)接著一個(gè)地執(zhí)行(一個(gè)任務(wù)執(zhí)行完畢后摇展,再執(zhí)行下一個(gè)任務(wù))

總結(jié)

?   同步和異步?jīng)Q定了要不要開啟新的線程
?   同步:在當(dāng)前線程中執(zhí)行任務(wù)岩梳,不具備開啟新線程的能力
?   異步:在新的線程中執(zhí)行任務(wù),具備開啟新線程的能力
?   并發(fā)和串行決定了任務(wù)的執(zhí)行方式
?   并發(fā):多個(gè)任務(wù)并發(fā)(同時(shí))執(zhí)行
?   串行:一個(gè)任務(wù)執(zhí)行完畢后,再執(zhí)行下一個(gè)任務(wù)

全局隊(duì)列

本質(zhì)就是并發(fā)隊(duì)列

   dispatch_get_global_queue(0,0);

全局隊(duì)列和并發(fā)隊(duì)列的區(qū)別

?   并發(fā)隊(duì)列有名稱秒赤,可以跟蹤錯(cuò)誤妆档,全局隊(duì)列沒有
?   在ARC中不需要考慮釋放內(nèi)存萍悴, dispatch_release(q);不允許調(diào)用岩齿。在MRC中需要手動(dòng)釋放內(nèi)存太颤,
    并發(fā)隊(duì)列是create創(chuàng)建出來的 在MRC中見到create就要release,全局隊(duì)列不需要release(只有一個(gè))
?   一般我們使用全局隊(duì)列

主隊(duì)列

主隊(duì)列,異步任務(wù)

?   不開線程盹沈,同步執(zhí)行
?   主隊(duì)列特點(diǎn):如果主線程正在執(zhí)行代碼暫時(shí)不調(diào)度任務(wù)龄章,等主線程執(zhí)行結(jié)束后在執(zhí)行任務(wù)
?   主隊(duì)列又叫 全局串行隊(duì)列

主隊(duì)列,同步任務(wù)

?   程序執(zhí)行不出來(死鎖)
?   死鎖的原因,當(dāng)程序執(zhí)行到下面這段代碼的時(shí)候
?   主隊(duì)列:如果主線程正在執(zhí)行代碼乞封,就不調(diào)度任務(wù)
?   同步執(zhí)行:如果第一個(gè)任務(wù)沒有執(zhí)行做裙,就繼續(xù)等待第一個(gè)任務(wù)執(zhí)行完成,再執(zhí)行下一個(gè)任務(wù)此時(shí)互相等待肃晚,程序無法往下執(zhí)行(死鎖)
    dispatch_sync(q, ^{
       NSLog(@"%@ -- %d",[NSThread currentThread],i);
    });

死鎖解決方案

?   (主隊(duì)列锚贱,同步執(zhí)行)放入異步執(zhí)行  解決死鎖
dispatch_async(dispatch_get_global_queue(0, 0), ^{
      NSLog(@"全局隊(duì)列,異步執(zhí)行 %@",[NSThread currentThread]);
  //此時(shí)這行代碼 在子線程中運(yùn)行关串,同步執(zhí)行不用等待主線程執(zhí)行此同步執(zhí)行的任務(wù)
    dispatch_sync(dispatch_get_main_queue(), ^{
         NSLog(@"主隊(duì)列,同步執(zhí)行 %@",[NSThread currentThread]);
    });
    NSLog(@"==");
 });
Snip20160605_3.png

GCD其他操作

延時(shí)操作

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 
(int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

});

?   dispatch_after的定義
    dispatch_after(dispatch_time_t when,
    dispatch_queue_t queue,
    dispatch_block_t block);
     
?   dispatch_after的參數(shù)
    參數(shù)1  dispatch_time_t when
           多少納秒之后執(zhí)行
    參數(shù)2  dispatch_queue_t queue
           任務(wù)添加到那個(gè)隊(duì)列
    參數(shù)3  dispatch_block_t block
           要執(zhí)行的任務(wù)

Arc下的單例實(shí)現(xiàn)

static id _instancetype
+(instancetype)shardName{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken,^{
      _instancetype = [[self alloc]init]
    });
    return _instancetype;
}

調(diào)度組

?   有時(shí)候需要在多個(gè)異步任務(wù)都執(zhí)行完成之后繼續(xù)做某些事情拧廊,
比如下載歌曲,等所有的歌曲都下載完畢之后 轉(zhuǎn)到 主線程提示用戶
//1 全局隊(duì)列
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
//2 調(diào)度組
    dispatch_group_t group = dispatch_group_create();
//3 添加任務(wù)
    //把任務(wù)添加到隊(duì)列晋修,等任務(wù)執(zhí)行完成之后通知調(diào)度組
    dispatch_group_async(group, queue, ^{
        NSLog(@"歌曲1  %@",[NSThread currentThread]);
    });
    dispatch_group_async(group, queue, ^{
        NSLog(@"歌曲2  %@",[NSThread currentThread]);
    });
    dispatch_group_async(group, queue, ^{
        NSLog(@"歌曲3  %@",[NSThread currentThread]);
    });
 //4 所有任務(wù)都執(zhí)行完成后卦绣,獲得通知 (異步執(zhí)行)
    //等調(diào)度組中隊(duì)列的任務(wù)完成后,把block添加到指定的隊(duì)列
//    dispatch_group_notify(group, queue, ^{
//        NSLog(@"okkkkkkk   %@",[NSThread currentThread]);
//    });
 
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
//更新UI控件飞蚓,提示用戶
        NSLog(@"okkkkkkk   %@",[NSThread currentThread]);
    });
    NSLog(@"over");

[TOC]

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末滤港,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子趴拧,更是在濱河造成了極大的恐慌溅漾,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件著榴,死亡現(xiàn)場(chǎng)離奇詭異添履,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)脑又,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門暮胧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人问麸,你說我怎么就攤上這事往衷。” “怎么了严卖?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵席舍,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我哮笆,道長(zhǎng)来颤,這世上最難降的妖魔是什么汰扭? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮福铅,結(jié)果婚禮上萝毛,老公的妹妹穿的比我還像新娘。我一直安慰自己滑黔,他們只是感情好珊泳,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拷沸,像睡著了一般色查。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上撞芍,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天秧了,我揣著相機(jī)與錄音,去河邊找鬼序无。 笑死验毡,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的帝嗡。 我是一名探鬼主播晶通,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼哟玷!你這毒婦竟也來了狮辽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤巢寡,失蹤者是張志新(化名)和其女友劉穎喉脖,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體抑月,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡树叽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了谦絮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片题诵。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖层皱,靈堂內(nèi)的尸體忽然破棺而出性锭,到底是詐尸還是另有隱情,我是刑警寧澤奶甘,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布篷店,位于F島的核電站祭椰,受9級(jí)特大地震影響臭家,放射性物質(zhì)發(fā)生泄漏疲陕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一钉赁、第九天 我趴在偏房一處隱蔽的房頂上張望蹄殃。 院中可真熱鬧,春花似錦你踩、人聲如沸诅岩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)吩谦。三九已至,卻和暖如春膝藕,著一層夾襖步出監(jiān)牢的瞬間式廷,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工芭挽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留滑废,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓袜爪,卻偏偏與公主長(zhǎng)得像蠕趁,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子辛馆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

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