GCD子隊(duì)列的優(yōu)先級(jí)

概述
本篇來(lái)研究一下GCD中的子隊(duì)列如何設(shè)置優(yōu)先級(jí)。我們知道全局隊(duì)列可以有四種優(yōu)先級(jí)可以設(shè)置,而我們自己創(chuàng)建的隊(duì)列并沒(méi)有參數(shù)可以指定優(yōu)先級(jí),那么我們有辦法做到按優(yōu)先級(jí)來(lái)執(zhí)行任務(wù)嗎?
通過(guò)本篇文章,您將學(xué)習(xí)到以下知識(shí)點(diǎn):
如何創(chuàng)建子隊(duì)列
如何給子隊(duì)列添加優(yōu)先級(jí)

如何設(shè)置子隊(duì)列

蘋(píng)果提供了一個(gè)設(shè)置子隊(duì)列的API:dispatch_set_target_queue,通過(guò)它可以設(shè)置調(diào)整目標(biāo)隊(duì)列,比如我們可以設(shè)置目標(biāo)隊(duì)列為全局隊(duì)列,那么這個(gè)全局隊(duì)列可以先設(shè)置優(yōu)先級(jí),如此就可以解決子隊(duì)列優(yōu)先級(jí)的問(wèn)題。比如下面這樣設(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");
});

打印效果圖如下:

Paste_Image.png

我們把串行隊(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é)果如下:

Paste_Image.png

從打印結(jié)果來(lái)看,任務(wù)global_queue1、global_queue2、global_queue3是相同優(yōu)先級(jí)且是最高的,所以這三個(gè)任務(wù)優(yōu)先執(zhí)行,并不是按FIFO來(lái)出隊(duì)執(zhí)行了。子隊(duì)列被優(yōu)先放入全局隊(duì)列中,按道理說(shuō)它應(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í)行的順序是不確定的!

從效果圖可以看出來(lái),同一優(yōu)先級(jí)的g1、g2、g3表現(xiàn)出了執(zhí)行的順序是亂的。同樣,同一優(yōu)先級(jí)的c1~c5也表現(xiàn)也執(zhí)行的順序是亂的,也就是隨機(jī)性!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容