iOS深入理解GCD 第一篇( 并行、串行鸳兽、異步掂铐、同步的加深理解)

并行、串行揍异、異步全陨、同步的加深理解

單個(gè)理解:

并行:就是隊(duì)列里面的任務(wù)(代碼塊,block)不是一個(gè)個(gè)執(zhí)行衷掷,而是同時(shí)執(zhí)行辱姨,不存在先后順序

串行:隊(duì)列里面的任務(wù)一個(gè)接著一個(gè)執(zhí)行,第一個(gè)執(zhí)行完了才能輪到第二個(gè)

異步:具有新開線程的能力

同步:不具備有新開線程的能力棍鳖,只能在當(dāng)前線程執(zhí)行任務(wù)(所以任務(wù)只能一個(gè)挨著一個(gè)執(zhí)行炮叶,而不能同時(shí)進(jìn)行)

串起來理解:

并行+異步:就是真正的并發(fā),新開有有多個(gè)線程處理任務(wù)渡处,任務(wù)并發(fā)執(zhí)行(不按順序執(zhí)行)
串行+異步:新開一個(gè)線程镜悉,任務(wù)一個(gè)接一個(gè)執(zhí)行,上一個(gè)任務(wù)處理完畢医瘫,下一個(gè)任務(wù)才可以被執(zhí)行
并行+同步:不新開線程侣肄,任務(wù)一個(gè)接一個(gè)執(zhí)行
串行+同步:不新開線程,任務(wù)一個(gè)接一個(gè)執(zhí)行

? 這里不得不說一下醇份,之前看了這篇博客

http://www.cnblogs.com/ziyi--caolu/p/4900650.html 該作者成功的將我繞進(jìn)了里面稼锅,其實(shí)歸根究底,只要是在同步環(huán)境中僚纷,并行和串行確實(shí)就可以這么理解矩距,

即并行+同步 和 串行+同步 都是不新開線程,并且任務(wù)一個(gè)接一個(gè)執(zhí)行

下面是具體代碼示例:

一:異步并行隊(duì)列內(nèi)回調(diào)同步串行隊(duì)列

- (void)exampleFirst {
    dispatch_queue_t queue = dispatch_queue_create("com.hao123.www", DISPATCH_QUEUE_SERIAL);
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSLog(@"外部---11  %@",[NSThread currentThread]);
        dispatch_sync(queue, ^{
            //打印結(jié)果與主隊(duì)列bingxingyibuqiantaozhu函數(shù)保持一致
            NSLog(@"11  %@",[NSThread currentThread]);
        });
    });
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSLog(@"外部---22  %@",[NSThread currentThread]);
        dispatch_sync(queue, ^{
            NSLog(@"22  %@",[NSThread currentThread]);
        });
    });
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSLog(@"外部---33  %@",[NSThread currentThread]);
        dispatch_sync(queue, ^{
            NSLog(@"33  %@",[NSThread currentThread]);
        });
    });
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSLog(@"外部---44  %@",[NSThread currentThread]);
        dispatch_sync(queue, ^{
            NSLog(@"44  %@",[NSThread currentThread]);
        });
    });
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSLog(@"外部---55  %@",[NSThread currentThread]);
        dispatch_sync(queue, ^{
            NSLog(@"55  %@",[NSThread currentThread]);
        });
    });
}

打印結(jié)果

2017-09-08 14:29:24.407 GcdInsightTest[63582:2978456] 外部---44  <NSThread: 0x608000072780>{number = 6, name = (null)}
2017-09-08 14:29:24.407 GcdInsightTest[63582:2978364] 外部---11  <NSThread: 0x608000070f40>{number = 3, name = (null)}
2017-09-08 14:29:24.407 GcdInsightTest[63582:2978366] 外部---33  <NSThread: 0x600000076380>{number = 5, name = (null)}
2017-09-08 14:29:24.407 GcdInsightTest[63582:2978363] 外部---22  <NSThread: 0x600000072f00>{number = 4, name = (null)}
2017-09-08 14:29:24.407 GcdInsightTest[63582:2978457] 外部---55  <NSThread: 0x608000073340>{number = 7, name = (null)}
2017-09-08 14:29:24.407 GcdInsightTest[63582:2978456] 44  <NSThread: 0x608000072780>{number = 6, name = (null)}
2017-09-08 14:29:24.407 GcdInsightTest[63582:2978364] 11  <NSThread: 0x608000070f40>{number = 3, name = (null)}
2017-09-08 14:29:24.408 GcdInsightTest[63582:2978366] 33  <NSThread: 0x600000076380>{number = 5, name = (null)}
2017-09-08 14:29:24.408 GcdInsightTest[63582:2978363] 22  <NSThread: 0x600000072f00>{number = 4, name = (null)}
2017-09-08 14:29:24.408 GcdInsightTest[63582:2978457] 55  <NSThread: 0x608000073340>{number = 7, name = (null)}

二:異步并行內(nèi)回調(diào)同步并行隊(duì)列

- (void)exampleSecond {
 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSLog(@"外部---11  %@",[NSThread currentThread]);
        //對(duì)比異步并行回調(diào)同步串行怖竭,可以看出當(dāng)外部異步并行隊(duì)列未執(zhí)行完畢時(shí)锥债,有可能內(nèi)部同步并行隊(duì)列已經(jīng)開始執(zhí)行了
        dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            NSLog(@"11  %@",[NSThread currentThread]);
        });
    });
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSLog(@"外部---22  %@",[NSThread currentThread]);
        dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            NSLog(@"22  %@",[NSThread currentThread]);
        });
    });
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSLog(@"外部---33  %@",[NSThread currentThread]);
        dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            NSLog(@"33  %@",[NSThread currentThread]);
        });
    });
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSLog(@"外部---44  %@",[NSThread currentThread]);
        dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            NSLog(@"44  %@",[NSThread currentThread]);
        });
    });
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSLog(@"外部---55  %@",[NSThread currentThread]);
        dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            NSLog(@"55  %@",[NSThread currentThread]);
        });
    });
}

打印結(jié)果

2017-09-08 14:34:59.192 GcdInsightTest[64242:2984344] 外部---11  <NSThread: 0x608000263040>{number = 13, name = (null)}
2017-09-08 14:34:59.192 GcdInsightTest[64242:2984353] 外部---22  <NSThread: 0x608000262480>{number = 17, name = (null)}
2017-09-08 14:34:59.192 GcdInsightTest[64242:2984111] 外部---33  <NSThread: 0x608000073980>{number = 12, name = (null)}
2017-09-08 14:34:59.192 GcdInsightTest[64242:2984345] 外部---55  <NSThread: 0x60000007f1c0>{number = 16, name = (null)}
2017-09-08 14:34:59.192 GcdInsightTest[64242:2984346] 外部---44  <NSThread: 0x608000074d40>{number = 14, name = (null)}
2017-09-08 14:34:59.193 GcdInsightTest[64242:2984344] 11  <NSThread: 0x608000263040>{number = 13, name = (null)}
2017-09-08 14:34:59.194 GcdInsightTest[64242:2984353] 22  <NSThread: 0x608000262480>{number = 17, name = (null)}
2017-09-08 14:34:59.194 GcdInsightTest[64242:2984111] 33  <NSThread: 0x608000073980>{number = 12, name = (null)}
2017-09-08 14:34:59.194 GcdInsightTest[64242:2984345] 55  <NSThread: 0x60000007f1c0>{number = 16, name = (null)}
2017-09-08 14:34:59.194 GcdInsightTest[64242:2984346] 44  <NSThread: 0x608000074d40>{number = 14, name = (null)}

根據(jù)兩段例子的打印結(jié)果,可以顯而易見的得出結(jié)論:

一:由于外部是異步并行隊(duì)列痊臭,所以外部打印結(jié)果不按順序執(zhí)行哮肚。

二:當(dāng)外部所有隊(duì)列執(zhí)行完畢,內(nèi)部隊(duì)列才開始執(zhí)行广匙。

三:其內(nèi)部的隊(duì)列將與外部隊(duì)列順序保持一致允趟,無論異步并行隊(duì)列內(nèi)回調(diào)的是同步串行隊(duì)列,還是同步并行隊(duì)列鸦致,只有當(dāng)外部隊(duì)列執(zhí)行完畢潮剪,接下來內(nèi)部隊(duì)列才會(huì)在同一個(gè)線程繼續(xù)執(zhí)行直到任務(wù)結(jié)束涣楷。

根據(jù)第三條可以得出結(jié)論:
并行+同步:不新開線程,任務(wù)一個(gè)接一個(gè)執(zhí)行
串行+同步:不新開線程鲁纠,任務(wù)一個(gè)接一個(gè)執(zhí)行
這兩句話沒毛病~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末总棵,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子改含,更是在濱河造成了極大的恐慌情龄,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,378評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捍壤,死亡現(xiàn)場(chǎng)離奇詭異骤视,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)鹃觉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門专酗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人盗扇,你說我怎么就攤上這事祷肯。” “怎么了疗隶?”我有些...
    開封第一講書人閱讀 168,983評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵佑笋,是天一觀的道長。 經(jīng)常有香客問我斑鼻,道長蒋纬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,938評(píng)論 1 299
  • 正文 為了忘掉前任坚弱,我火速辦了婚禮蜀备,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘荒叶。我一直安慰自己碾阁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評(píng)論 6 398
  • 文/花漫 我一把揭開白布些楣。 她就那樣靜靜地躺著瓷蛙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪戈毒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,549評(píng)論 1 312
  • 那天横堡,我揣著相機(jī)與錄音埋市,去河邊找鬼。 笑死命贴,一個(gè)胖子當(dāng)著我的面吹牛道宅,可吹牛的內(nèi)容都是我干的食听。 我是一名探鬼主播,決...
    沈念sama閱讀 41,063評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼污茵,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼樱报!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起泞当,我...
    開封第一講書人閱讀 39,991評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤迹蛤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后襟士,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盗飒,經(jīng)...
    沈念sama閱讀 46,522評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評(píng)論 3 342
  • 正文 我和宋清朗相戀三年陋桂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了逆趣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,742評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嗜历,死狀恐怖宣渗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情梨州,我是刑警寧澤痕囱,帶...
    沈念sama閱讀 36,413評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站摊唇,受9級(jí)特大地震影響咐蝇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜巷查,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評(píng)論 3 335
  • 文/蒙蒙 一有序、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧岛请,春花似錦旭寿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至后室,卻和暖如春缩膝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背岸霹。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評(píng)論 1 274
  • 我被黑心中介騙來泰國打工疾层, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人贡避。 一個(gè)月前我還...
    沈念sama閱讀 49,159評(píng)論 3 378
  • 正文 我出身青樓痛黎,卻偏偏與公主長得像予弧,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子湖饱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評(píng)論 2 361

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

  • 從哪說起呢掖蛤? 單純講多線程編程真的不知道從哪下嘴。井厌。 不如我直接引用一個(gè)最簡單的問題蚓庭,以這個(gè)作為切入點(diǎn)好了 在ma...
    Mr_Baymax閱讀 2,770評(píng)論 1 17
  • 串行隊(duì)列、并行隊(duì)列旗笔、同步彪置、異步是gcd編程中四個(gè)非常重要的概念,它們的組合會(huì)產(chǎn)生多種不同的執(zhí)行順序蝇恶,在本文拳魁,我主要...
    wind_dy閱讀 1,224評(píng)論 0 2
  • 本文翻譯自 http://www.raywenderlich.com/60749/grand-central-di...
    skogt閱讀 1,234評(píng)論 2 10
  • GCD 深入理解:第一部分 什么是 GCD GCD 是 libdispatch 的市場(chǎng)名稱,而 libdispat...
    willphonez閱讀 627評(píng)論 0 2
  • 屏幕坐標(biāo)體系:左上角為原點(diǎn)(0撮弧,0)潘懊,向右為X軸正值,向下為Y軸正值 以800*480手機(jī)為例贿衍,右下角坐標(biāo)為...
    慢牛策略閱讀 236評(píng)論 0 0