博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
GCD子队列的优先级
阅读量:7045 次
发布时间:2019-06-28

本文共 2312 字,大约阅读时间需要 7 分钟。

概述 本篇来研究一下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");     }); 打印效果图如下:

我们把串行队列放到了优先级为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");     });

打印的结果如下:

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

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

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

转载地址:http://tveal.baihongyu.com/

你可能感兴趣的文章
android Webview直接打开 不让它跳到内部的浏览器
查看>>
shell基础day11
查看>>
Golang 中使用 JSON 的小技巧
查看>>
VMware7安装CentOS6.5教程
查看>>
控制 Memory 和 CPU 资源的使用
查看>>
怎么用VBA在excel中指定位置画图表? 如怎么用VBA在 A7:G13位置画出图标
查看>>
makefile扩展
查看>>
SCOM 2012 SP1 监控网络设备 概览
查看>>
IBM x3650硬盘故障
查看>>
高并发架构系列:Redis的内存回收原理,及内存过期淘汰策略详解
查看>>
Python模块optparse学习
查看>>
asp带验证码的用户登录及校验代码实现
查看>>
深入理解 String, StringBuffer 与 StringBuilder 的区别
查看>>
使用局jQuery提交file
查看>>
使用Parse内付费服务出现的Error Domain=Parse Code=146 "The operation couldn’t be completed....
查看>>
2013年4月IT技术行业网站综合影响力排名
查看>>
Magento session机制的分析与应用
查看>>
linux 服务器长ping 加时间戳;转
查看>>
http与https的区别
查看>>
一些可以查询IP地理位置、身份证所在地、手机归属地的接口
查看>>