iOS8 GCD多线程新特性QoS 设置队列优先级
2017-09-29 15:13
357 查看
iOS8 GCD多线程新特性QoS
设置队列优先级
Quality of Service(QoS)
这是在iOS8之后提供的新功能,苹果提供了几个Quality of Service枚举来使用:user interactive, user initiated, utility
和 background,通过这告诉系统我们在进行什么样的工作,然后系统会通过合理的资源控制来最高效的执行任务代码,其中主要涉及到CPU调度的优先级、IO优先级、任务运行在哪个线程以及运行的顺序等等,我们通过一个抽象的Quality of Service参数来表明任务的意图以及类别。
GCD默认已经提供了全局的并发队列供整个应用使用,所以可以不用手动创建。
创建全局队列的函数为
dispatch_queue_t q = dispatch_get_global_queue(long identifier, unsigned long flags)
参数类型为:
long identifier:ios 8.0 告诉队列执行任务的“服务质量 quality of service”,系统提供的参数有:
QOS_CLASS_USER_INTERACTIVE 0x21, 用户交互(希望尽快完成,用户对结果很期望,不要放太耗时操作)
QOS_CLASS_USER_INITIATED 0x19, 用户期望(不要放太耗时操作)
QOS_CLASS_DEFAULT 0x15,
默认(不是给程序员使用的,用来重置对列使用的)
QOS_CLASS_UTILITY 0x11,
实用工具(耗时操作,可以使用这个选项)
QOS_CLASS_BACKGROUND 0x09,
后台
QOS_CLASS_UNSPECIFIED 0x00,
未指定
iOS 7.0 之前
优先级
DISPATCH_QUEUE_PRIORITY_HIGH 2
高优先级
DISPATCH_QUEUE_PRIORITY_DEFAULT 0
默认优先级
DISPATCH_QUEUE_PRIORITY_LOW (-2)
低优先级
DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN 后台优先级
BACKGROUND表示用户不需要知道任务什么时候完成,如果选择这个选项速度慢得令人发指,非常不利于调试!对于优先级推荐不要搞得太负责,就用最简单,以免发生优先级反转。
unsigned long flags:苹果官方文档是这样解释的: Flags that are reserved for future use。标记是为了未来使用保留的!所以这个参数应该永远指定为0。
自定义队列的优先级:可以通过
dipatch_queue_attr_make_with_qos_class 或 dispatch_set_target_queue方法设置队列的优先级
//dipatch_queue_attr_make_with_qos_class
dispatch_queue_attr_t attr = dispatch_queue_attr_make_with_qos_class(DISPATCH_QUEUE_SERIAL, QOS_CLASS_UTILITY, -1);
dispatch_queue_t queue = dispatch_queue_create("com.starming.gcddemo.qosqueue", attr);
//dispatch_set_target_queue
dispatch_queue_t queue = dispatch_queue_create("com.starming.gcddemo.settargetqueue",NULL); //需要设置优先级的queue
dispatch_queue_t referQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0); //参考优先级
dispatch_set_target_queue(queue, referQueue); //设置queue和referQueue的优先级一样
dispatch_set_target_queue:可以设置优先级,也可以设置队列层级体系,比如让多个串行和并行队列在统一一个串行队列里串行执行,如下
dispatch_queue_t serialQueue = dispatch_queue_create("com.starming.gcddemo.serialqueue", DISPATCH_QUEUE_SERIAL);
dispatch_queue_t firstQueue = dispatch_queue_create("com.starming.gcddemo.firstqueue", DISPATCH_QUEUE_SERIAL);
dispatch_queue_t secondQueue = dispatch_queue_create("com.starming.gcddemo.secondqueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_set_target_queue(firstQueue, serialQueue);
dispatch_set_target_queue(secondQueue, serialQueue);
dispatch_async(firstQueue, ^{
NSLog(@"1");
[NSThread sleepForTimeInterval:3.f];
});
dispatch_async(secondQueue, ^{
NSLog(@"2");
[NSThread sleepForTimeInterval:2.f];
});
dispatch_async(secondQueue, ^{
NSLog(@"3");
[NSThread sleepForTimeInterval:1.f];
});
参考内容:
http://subscribe.mail.10086.cn/subscribe/readAll.do?columnId=563&itemId=3130310
http://www.jianshu.com/p/f9e01c69a46f
http://www.cnblogs.com/jinciyisheng/p/5645715.html
设置队列优先级
Quality of Service(QoS)
这是在iOS8之后提供的新功能,苹果提供了几个Quality of Service枚举来使用:user interactive, user initiated, utility
和 background,通过这告诉系统我们在进行什么样的工作,然后系统会通过合理的资源控制来最高效的执行任务代码,其中主要涉及到CPU调度的优先级、IO优先级、任务运行在哪个线程以及运行的顺序等等,我们通过一个抽象的Quality of Service参数来表明任务的意图以及类别。
GCD默认已经提供了全局的并发队列供整个应用使用,所以可以不用手动创建。
创建全局队列的函数为
dispatch_queue_t q = dispatch_get_global_queue(long identifier, unsigned long flags)
参数类型为:
long identifier:ios 8.0 告诉队列执行任务的“服务质量 quality of service”,系统提供的参数有:
QOS_CLASS_USER_INTERACTIVE 0x21, 用户交互(希望尽快完成,用户对结果很期望,不要放太耗时操作)
QOS_CLASS_USER_INITIATED 0x19, 用户期望(不要放太耗时操作)
QOS_CLASS_DEFAULT 0x15,
默认(不是给程序员使用的,用来重置对列使用的)
QOS_CLASS_UTILITY 0x11,
实用工具(耗时操作,可以使用这个选项)
QOS_CLASS_BACKGROUND 0x09,
后台
QOS_CLASS_UNSPECIFIED 0x00,
未指定
iOS 7.0 之前
优先级
DISPATCH_QUEUE_PRIORITY_HIGH 2
高优先级
DISPATCH_QUEUE_PRIORITY_DEFAULT 0
默认优先级
DISPATCH_QUEUE_PRIORITY_LOW (-2)
低优先级
DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN 后台优先级
BACKGROUND表示用户不需要知道任务什么时候完成,如果选择这个选项速度慢得令人发指,非常不利于调试!对于优先级推荐不要搞得太负责,就用最简单,以免发生优先级反转。
unsigned long flags:苹果官方文档是这样解释的: Flags that are reserved for future use。标记是为了未来使用保留的!所以这个参数应该永远指定为0。
自定义队列的优先级:可以通过
dipatch_queue_attr_make_with_qos_class 或 dispatch_set_target_queue方法设置队列的优先级
//dipatch_queue_attr_make_with_qos_class
dispatch_queue_attr_t attr = dispatch_queue_attr_make_with_qos_class(DISPATCH_QUEUE_SERIAL, QOS_CLASS_UTILITY, -1);
dispatch_queue_t queue = dispatch_queue_create("com.starming.gcddemo.qosqueue", attr);
//dispatch_set_target_queue
dispatch_queue_t queue = dispatch_queue_create("com.starming.gcddemo.settargetqueue",NULL); //需要设置优先级的queue
dispatch_queue_t referQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0); //参考优先级
dispatch_set_target_queue(queue, referQueue); //设置queue和referQueue的优先级一样
dispatch_set_target_queue:可以设置优先级,也可以设置队列层级体系,比如让多个串行和并行队列在统一一个串行队列里串行执行,如下
dispatch_queue_t serialQueue = dispatch_queue_create("com.starming.gcddemo.serialqueue", DISPATCH_QUEUE_SERIAL);
dispatch_queue_t firstQueue = dispatch_queue_create("com.starming.gcddemo.firstqueue", DISPATCH_QUEUE_SERIAL);
dispatch_queue_t secondQueue = dispatch_queue_create("com.starming.gcddemo.secondqueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_set_target_queue(firstQueue, serialQueue);
dispatch_set_target_queue(secondQueue, serialQueue);
dispatch_async(firstQueue, ^{
NSLog(@"1");
[NSThread sleepForTimeInterval:3.f];
});
dispatch_async(secondQueue, ^{
NSLog(@"2");
[NSThread sleepForTimeInterval:2.f];
});
dispatch_async(secondQueue, ^{
NSLog(@"3");
[NSThread sleepForTimeInterval:1.f];
});
参考内容:
http://subscribe.mail.10086.cn/subscribe/readAll.do?columnId=563&itemId=3130310
http://www.jianshu.com/p/f9e01c69a46f
http://www.cnblogs.com/jinciyisheng/p/5645715.html
相关文章推荐
- IOS多线程知识总结/队列概念/GCD/主队列/并行队列/全局队列/主队列/串行队列/同步任务/异步任务区别(附代码)
- 使用GCD实现多线程队列
- [ios2]使用NSOperationQueue简化多线程开发和队列的优先级 【转】
- GCD网络多线程---同步执行,异步执行,串行队列,并行队列
- java多线程设置优先级
- iOS-多线程编程学习之GCD——串行队列和并发队列(五)
- 第02天多线程网络:(04):GCD队列组的使用
- Hadoop设置任务执行队列及优先级
- Java 多线程 优先级队列 PriorityBlockingQueue
- posix多线程有感--线程高级编程(线程调度以及优先级设置)
- 使用NSOperationQueue简化多线程开发和队列的优先级
- 4.iOS多线程中,GCD技术的队列与执行方式的组合结果
- 多线程GCD之图片异步加载主队列刷新UI
- 多线程-线程调度及获取和设置线程优先级
- 转载:GCD优先级子队列扫盲
- 刀哥多线程串行队列gcd-04-dispatch_queue_serial
- iOS多线程开发小demo7 GCD队列组
- iOS中多线程知识总结:进程、线程、GCD、串行队列、并行队列、全局队列、主线程队列、同步任务、异步任务等
- Hadoop 设置任务执行的队列以及优先级
- posix多线程有感--线程高级编程(线程调度以及优先级设置)