GCD串行并發(fā)隊(duì)列

學(xué)習(xí)完本篇漩蟆,您會對以下知識點(diǎn)更加理解:

  • 隊(duì)列
  • 串行隊(duì)列
  • 并發(fā)隊(duì)列
  • GCD全局隊(duì)列
  • GCD主隊(duì)列
  • 創(chuàng)建串行隊(duì)列
  • 創(chuàng)建并發(fā)隊(duì)列

Paste_Image.png

隊(duì)列

不管是什么隊(duì)列烙肺,一定是FIFO隊(duì)列饮焦,即先進(jìn)先出眼虱。
所以马胧,請大家記住了:不管是串行隊(duì)列(SerialQueue)還是并發(fā)隊(duì)列(ConcurrencyQueue)宴卖,都是FIFO隊(duì)列滋将。也就意味著,任務(wù)一定是一個一個地症昏,按照先進(jìn)先出的順序來執(zhí)行随闽。
串行隊(duì)列:在創(chuàng)建隊(duì)列時,傳參數(shù)DISPATCH_QUEUE_SERIAL表示創(chuàng)建串行隊(duì)列肝谭。任務(wù)會一個一個地執(zhí)行掘宪,只有前一個任務(wù)執(zhí)行完成,才會繼續(xù)執(zhí)行下一個任務(wù)分苇。串行執(zhí)行并不是同步執(zhí)行的意思添诉,一定要注意區(qū)分
并發(fā)隊(duì)列:在創(chuàng)建隊(duì)列時,傳參數(shù)DISPATCH_QUEUE_CONCURRENT表示創(chuàng)建并發(fā)隊(duì)列医寿。并發(fā)隊(duì)列會盡可能多地創(chuàng)建線程去執(zhí)行任務(wù)栏赴。并發(fā)隊(duì)列中的任務(wù)會按入隊(duì)的順序執(zhí)行任務(wù),但是哪個任務(wù)先完成是不確定的靖秩。

隊(duì)列類型

蘋果提供了以下隊(duì)列:

全局隊(duì)列:蘋果預(yù)定義的全局并發(fā)隊(duì)列须眷,只能通過蘋果提供的API來獲取,可以設(shè)置優(yōu)先級沟突。
主隊(duì)列:在應(yīng)用啟動的時候花颗,就會自動創(chuàng)建與主線程關(guān)聯(lián)的串行隊(duì)列,我們也可能獲取惠拭,不能手動創(chuàng)建扩劝。
手動創(chuàng)建串行隊(duì)列
手動創(chuàng)建并發(fā)隊(duì)列

全局隊(duì)列

全局隊(duì)列的第二個參數(shù)用于設(shè)置優(yōu)先級庸论,只有下面四個選項(xiàng):
DISPATCH_QUEUE_PRIORITY_HIGH 2
DISPATCH_QUEUE_PRIORITY_DEFAULT 0
DISPATCH_QUEUE_PRIORITY_LOW (-2)
DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN"
我們通常使用默認(rèn)選項(xiàng),所以很多時候看到的都是傳0棒呛。下面我們來看看創(chuàng)建四個任務(wù)放到并發(fā)隊(duì)列中異步地執(zhí)行:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"1");
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 睡眠2秒
sleep(2);
NSLog(@"2");
});

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
   // 睡眠3秒
   sleep(1);
  NSLog(@"3");
  });

打印結(jié)果如下:


Paste_Image.png

三個任務(wù)分別在三個線程中進(jìn)行才有三個線程號聂示。
上面的代碼中,我們在并發(fā)隊(duì)列中添加了三個任務(wù)簇秒,其中任務(wù)1是直接執(zhí)行鱼喉,任務(wù)2是在異步執(zhí)行過程中被睡眠2秒,任務(wù)3在異步執(zhí)行過程中被睡眠1秒趋观,結(jié)果任務(wù)3先于任務(wù)2執(zhí)行完成扛禽。說明并發(fā)執(zhí)行任務(wù)并不需要等待其他任務(wù)先執(zhí)行完。對于這三個任務(wù)皱坛,是互不干擾的编曼!
當(dāng)然,全局隊(duì)列可以指定任務(wù)執(zhí)行的優(yōu)先級的麸恍,比如下面:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
NSLog(@"4");
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
NSLog(@"3");
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"2");
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
NSLog(@"1");
});

Paste_Image.png

優(yōu)先級由高到低順序運(yùn)行 任務(wù)一優(yōu)先級最高灵巧,所以在并發(fā)隊(duì)列中優(yōu)先執(zhí)行。

主隊(duì)列

主隊(duì)列是應(yīng)用程序啟動時抹沪,由系統(tǒng)預(yù)先創(chuàng)建的刻肄,與主線程相關(guān)聯(lián)的隊(duì)列。我們只能通過系統(tǒng)API來獲取主隊(duì)列融欧,不能手動創(chuàng)建它索守。下面我們來看看主隊(duì)列這個串行隊(duì)列的執(zhí)行順序如何:

 dispatch_async(dispatch_get_main_queue(), ^{
  sleep(2);
NSLog(@"main 1");
});

dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"main 2");
});

dispatch_async(dispatch_get_main_queue(), ^{
sleep(1);
NSLog(@"main 3");
});

運(yùn)行結(jié)果如下:


Paste_Image.png

從打印結(jié)果可看到執(zhí)行的順序是按入隊(duì)的順序來執(zhí)行的为严。雖然讓任務(wù)1睡眠2秒再執(zhí)行,其他任務(wù)也只能等待任務(wù)1完成,才能繼承執(zhí)行任務(wù)2窒篱,在任務(wù)2執(zhí)行完成灿里,才能執(zhí)行任務(wù)3忱详。
從打印結(jié)果可以看到線程號是固定的骑晶,說明都在同一個線程中執(zhí)行,而這個線程就是主線程刺桃。任務(wù)只能一個一個地執(zhí)行粹淋。

創(chuàng)建串行隊(duì)列

通過dispatch_queue_create函數(shù)來創(chuàng)建隊(duì)列,參數(shù)一是一個C語言的字符串瑟慈,是隊(duì)列的標(biāo)簽桃移,也就是名稱,參數(shù)二是指定串行隊(duì)列還是并發(fā)隊(duì)列葛碧。
創(chuàng)建串行隊(duì)列傳:DISPATCH_QUEUE_SERIAL(也就是NULL)
創(chuàng)建并發(fā)隊(duì)列傳:DISPATCH_QUEUE_CONCURRENT

dispatch_queue_t serialQueue = dispatch_queue_create("serial_queue", 
DISPATCH_QUEUE_SERIAL);
dispatch_async(serialQueue, ^{
  NSLog(@"s1");
 });
dispatch_async(serialQueue, ^{
  sleep(2);
  NSLog(@"s2");
});
dispatch_async(serialQueue, ^{
sleep(1);
NSLog(@"s3");
});

打印結(jié)果如下:


Paste_Image.png

創(chuàng)建的串行隊(duì)列只在一個線程運(yùn)行借杰。

創(chuàng)建并發(fā)隊(duì)列

通過dispatch_queue_create函數(shù)來創(chuàng)建隊(duì)列,參數(shù)一是一個C語言的字符串进泼,是隊(duì)列的標(biāo)簽蔗衡,也就是名稱纤虽,參數(shù)二是指定串行隊(duì)列還是并發(fā)隊(duì)列。
創(chuàng)建串行隊(duì)列傳:DISPATCH_QUEUE_SERIAL(也就是NULL)
創(chuàng)建并發(fā)隊(duì)列傳:DISPATCH_QUEUE_CONCURRENT
一起來看看串行隊(duì)列是否需要等待任務(wù)執(zhí)行完成粘都,下一個任務(wù)才能開始:

dispatch_queue_t concurrencyQueue = dispatch_queue_create("com.huangyibiao.concurrency-queue",                            
DISPATCH_QUEUE_CONCURRENT);

dispatch_async(concurrencyQueue, ^{
NSLog(@"s1");
});
dispatch_async(concurrencyQueue, ^{
 sleep(2);
 NSLog(@"s2");
});
dispatch_async(concurrencyQueue, ^{
sleep(1);
NSLog(@"s3");
});

打印結(jié)果:


Paste_Image.png

從打印結(jié)果可以看出來廓推,任務(wù)在三個子線程中執(zhí)行刷袍,且互不干擾翩隧,不需要等待其他任務(wù)完成,就可以并發(fā)地分別去執(zhí)行呻纹!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末堆生,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子雷酪,更是在濱河造成了極大的恐慌淑仆,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件哥力,死亡現(xiàn)場離奇詭異蔗怠,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)吩跋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進(jìn)店門寞射,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人锌钮,你說我怎么就攤上這事桥温。” “怎么了梁丘?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵侵浸,是天一觀的道長。 經(jīng)常有香客問我氛谜,道長掏觉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任值漫,我火速辦了婚禮澳腹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘惭嚣。我一直安慰自己遵湖,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布晚吞。 她就那樣靜靜地躺著延旧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪槽地。 梳的紋絲不亂的頭發(fā)上迁沫,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天芦瘾,我揣著相機(jī)與錄音,去河邊找鬼集畅。 笑死近弟,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的挺智。 我是一名探鬼主播祷愉,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼赦颇!你這毒婦竟也來了二鳄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤媒怯,失蹤者是張志新(化名)和其女友劉穎订讼,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扇苞,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡欺殿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了鳖敷。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脖苏。...
    茶點(diǎn)故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖哄陶,靈堂內(nèi)的尸體忽然破棺而出帆阳,到底是詐尸還是另有隱情,我是刑警寧澤屋吨,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布蜒谤,位于F島的核電站,受9級特大地震影響至扰,放射性物質(zhì)發(fā)生泄漏鳍徽。R本人自食惡果不足惜敢课,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一阶祭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧直秆,春花似錦濒募、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至筝野,卻和暖如春晌姚,著一層夾襖步出監(jiān)牢的瞬間粤剧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工挥唠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留抵恋,地道東北人。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓宝磨,卻偏偏與公主長得像弧关,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子懊烤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評論 2 355

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