GCD子队列的优先级

作者: iOSTbag | 来源:发表于2016-04-20 23:12 被阅读944次

概述
本篇来研究一下GCD中的子队列如何设置优先级。我们知道全局队列可以有四种优先级可以设置,而我们自己创建的队列并没有参数可以指定优先级,那么我们有办法做到按优先级来执行任务吗?
通过本篇文章,您将学习到以下知识点:
如何创建子队列
如何给子队列添加优先级

如何设置子队列

苹果提供了一个设置子队列的API:dispatch_set_target_queue,通过它可以设置调整目标队列,比如我们可以设置目标队列为全局队列,那么这个全局队列可以先设置优先级,如此就可以解决子队列优先级的问题。比如下面这样设置:
// 将serialQueue放到优先级为LOW的全局队列中作为子队列,
// 那么子队列的优先级也会跟着成为LOW优级

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(@"优先级高-global_queue4");
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    NSLog(@"优先级高-global_queue5");
});

打印效果图如下:

Paste_Image.png

我们把串行队列放到了优先级为LOW的全局队列中,另外还把任务4、5放到优先级为DEFAULT的全局队列中,所以优先执行任务4、5,最后才执行优先级为低的串行队列中的任务。
所以这里设置了优先级后,队列就不一定是按FIFO规则了,出队的顺序就变成了按优先级了。只有当所有的任务都是同一个优先级的情况下,才是FIFO。

并发子队列优先级

dispatch_queue_t concurrencyQueue = dispatch_queue_create("T-bag",              DISPATCH_QUEUE_CONCURRENT);
// 放到全局队列,设置优先级为LOW
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");
});

打印的结果如下:

Paste_Image.png

从打印结果来看,任务global_queue1、global_queue2、global_queue3是相同优先级且是最高的,所以这三个任务优先执行,并不是按FIFO来出队执行了。子队列被优先放入全局队列中,按道理说它应该优先出列然后执行任务,但是现在并不是这样子。所以FIFO是有条件的,那就是优先级相同的情况下才会这样。如果出现优先级不同,则会按优先级高的先出队执行。

并发队列执行任务的顺序是不确定的。对于同一优先级的任务,他们出队的顺序一定是FIFO,先进先出,但是先执行的顺序是不确定的!

从效果图可以看出来,同一优先级的g1、g2、g3表现出了执行的顺序是乱的。同样,同一优先级的c1~c5也表现也执行的顺序是乱的,也就是随机性!

相关文章

  • GCD子队列的优先级

    概述本篇来研究一下GCD中的子队列如何设置优先级。我们知道全局队列可以有四种优先级可以设置,而我们自己创建的队列并...

  • GCD

    线程 队列 GCD 公开有 5 个不同的队列运⾏在主线程中的主队列:Main Queue,3个不同优先级: Hig...

  • GCD会创建多少个线程

    关于GCD队列,系统队列编号有11个,1为主队列,2为管理队列,3保留;4-11为8个全局队列,优先级分别为LOW...

  • iOS多线程-dispatch_set_target_queue

    祭出demo在GCD里,我们通过dispatch_get_global_queue可以设置这个全局并发队列的优先级...

  • 《恋上数据结构与算法一》笔记(十七)优先级队列

    目录 优先级队列 优先级队列的应用场景举例 优先队列的底层实现 习题 一 优先级队列 优先级队列也是个队列,因此也...

  • 《数据结构与算法》总结(八)优先级队列

    目录 优先级队列 优先级队列的应用场景举例 优先队列的底层实现 习题 一 优先级队列 优先级队列也是个队列,因此也...

  • GCD队列、同步异步

    GCD队列、同步异步 GCD队列、同步异步

  • GCD的学习笔记(One)

    并行和并发 GCD简介 GCD的任务 GCD的队列 GCD创建队列或获取队列的方法 任务的执行方式:同步执行(同步...

  • iOS多线程--GCD篇

    GCD 文章目录GCD简介任务和队列GCD的使用步骤队列的创建方法任务的创建方法GCD的基本使用并行队列 + 同步...

  • GCD队列优先级简介

    //声明一个串行队列 优先级low dispatch_queue_t serialQueue= dispatch_...

网友评论

    本文标题:GCD子队列的优先级

    本文链接:https://www.haomeiwen.com/subject/ejctrttx.html