概述
本篇來研究一下GCD中的子隊(duì)列如何設(shè)置優(yōu)先級(jí)。我們知道全局隊(duì)列可以有四種優(yōu)先級(jí)可以設(shè)置引有,而我們自己創(chuàng)建的隊(duì)列并沒有參數(shù)可以指定優(yōu)先級(jí),那么我們有辦法做到按優(yōu)先級(jí)來執(zhí)行任務(wù)嗎?
通過本篇文章蜂桶,您將學(xué)習(xí)到以下知識(shí)點(diǎn):
如何創(chuàng)建子隊(duì)列
如何給子隊(duì)列添加優(yōu)先級(jí)
如何設(shè)置子隊(duì)列
蘋果提供了一個(gè)設(shè)置子隊(duì)列的API:dispatch_set_target_queue,通過它可以設(shè)置調(diào)整目標(biāo)隊(duì)列也切,比如我們可以設(shè)置目標(biāo)隊(duì)列為全局隊(duì)列扑媚,那么這個(gè)全局隊(duì)列可以先設(shè)置優(yōu)先級(jí)妥曲,如此就可以解決子隊(duì)列優(yōu)先級(jí)的問題。比如下面這樣設(shè)置:
// 將serialQueue放到優(yōu)先級(jí)為L(zhǎng)OW的全局隊(duì)列中作為子隊(duì)列钦购,
// 那么子隊(duì)列的優(yōu)先級(jí)也會(huì)跟著成為L(zhǎng)OW優(yōu)級(jí)
dispatch_queue_t serialQueue = dispatch_queue_create("T-bag",
DISPATCH_QUEUE_SERIAL);
dispatch_set_target_queue(serialQueue, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0));
dispatch_async(serialQueue, ^{
NSLog(@"serialQueue1");
});
dispatch_async(serialQueue, ^{
NSLog(@"serialQueue2");
});
dispatch_async(serialQueue, ^{
NSLog(@"serialQueue3");
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"優(yōu)先級(jí)高-global_queue4");
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"優(yōu)先級(jí)高-global_queue5");
});
打印效果圖如下:
我們把串行隊(duì)列放到了優(yōu)先級(jí)為L(zhǎng)OW的全局隊(duì)列中檐盟,另外還把任務(wù)4、5放到優(yōu)先級(jí)為DEFAULT的全局隊(duì)列中押桃,所以優(yōu)先執(zhí)行任務(wù)4葵萎、5,最后才執(zhí)行優(yōu)先級(jí)為低的串行隊(duì)列中的任務(wù)唱凯。
所以這里設(shè)置了優(yōu)先級(jí)后羡忘,隊(duì)列就不一定是按FIFO規(guī)則了,出隊(duì)的順序就變成了按優(yōu)先級(jí)了磕昼。只有當(dāng)所有的任務(wù)都是同一個(gè)優(yōu)先級(jí)的情況下卷雕,才是FIFO。
并發(fā)子隊(duì)列優(yōu)先級(jí)
dispatch_queue_t concurrencyQueue = dispatch_queue_create("T-bag", DISPATCH_QUEUE_CONCURRENT);
// 放到全局隊(duì)列票从,設(shè)置優(yōu)先級(jí)為L(zhǎng)OW
dispatch_set_target_queue(concurrencyQueue,
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0));
dispatch_async(concurrencyQueue, ^{
NSLog(@"concurrencyQueue1");
});
dispatch_async(concurrencyQueue, ^{
NSLog(@"concurrencyQueue2");
});
dispatch_async(concurrencyQueue, ^{
NSLog(@"concurrencyQueue3");
});
dispatch_async(concurrencyQueue, ^{
NSLog(@"concurrencyQueue4");
});
dispatch_async(concurrencyQueue, ^{
NSLog(@"concurrencyQueue5");
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"global_queue1");
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"global_queue2");
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"global_queue3");
});
打印的結(jié)果如下:
從打印結(jié)果來看漫雕,任務(wù)global_queue1、global_queue2峰鄙、global_queue3是相同優(yōu)先級(jí)且是最高的浸间,所以這三個(gè)任務(wù)優(yōu)先執(zhí)行,并不是按FIFO來出隊(duì)執(zhí)行了吟榴。子隊(duì)列被優(yōu)先放入全局隊(duì)列中魁蒜,按道理說它應(yīng)該優(yōu)先出列然后執(zhí)行任務(wù),但是現(xiàn)在并不是這樣子吩翻。所以FIFO是有條件的兜看,那就是優(yōu)先級(jí)相同的情況下才會(huì)這樣。如果出現(xiàn)優(yōu)先級(jí)不同狭瞎,則會(huì)按優(yōu)先級(jí)高的先出隊(duì)執(zhí)行细移。
并發(fā)隊(duì)列執(zhí)行任務(wù)的順序是不確定的。對(duì)于同一優(yōu)先級(jí)的任務(wù)脚作,他們出隊(duì)的順序一定是FIFO葫哗,先進(jìn)先出,但是先執(zhí)行的順序是不確定的球涛!
從效果圖可以看出來劣针,同一優(yōu)先級(jí)的g1、g2亿扁、g3表現(xiàn)出了執(zhí)行的順序是亂的捺典。同樣,同一優(yōu)先級(jí)的c1~c5也表現(xiàn)也執(zhí)行的順序是亂的从祝,也就是隨機(jī)性襟己!