GCD
Grand Central Dispatch
(GCD) 字面意思 宏大的中央调度器 反正就是很牛逼吧
在 gcd 中并不叫多线程开发,因为开发者并不涉及线程的开启和关闭以及调度. 只是操作任务在队列中, 所有关于线程的事都是有 GCD 帮我们去做的;
线程的开启线程的以及操作都是通过 GCD 完成的 所以开发者并不牵扯到线程的调度;只是调度的任务.具体开多少线程 什么时候开都有系统自己去操作
主队列 & 串行队列的区别?
一个一个安排任务,队列特点:FIFO
-并发队列:可以调度多个任务
-串行队列:必须等待一个任务执行完成,再调度另外一个任务。最多只能开启一个线程。
-主队列:以FIFO调度任务,如果主线程删共有任何任务在执行,主队列就不会调度任务,主要负责在主线程上执行任务!
全局队列
/* ios 7 DISPATCH_QUEUE_PRIORITY_HIGH 2 高优先级 DISPATCH_QUEUE_PRIORITY_DEFAULT 0 默认优先级 DISPATCH_QUEUE_PRIORITY_LOW (-2) 低优先级 DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN 非常低 基本忽略 ios 8 用户体验度 * - QOS_CLASS_USER_INTERACTIVE 用户交互 * - QOS_CLASS_USER_INITIATED 用户使用 * - QOS_CLASS_DEFAULT 默认使用 * - QOS_CLASS_UTILITY 使用工具 * - QOS_CLASS_BACKGROUND 后台使用 预留参数 */ dispatch_async(dispatch_get_global_queue(QOS_CLASS_DEFAULT, 0), ^{ NSLog(@"异步"); });
并发异步
/** 并发异步 开启异步线程 执行顺序 无序
第一个参数: 线程标识符
第二个参数:DISPATCH_QUEUE_CONCURRENT 并发队列
*/ dispatch_queue_t q = dispatch_queue_create(queueName, DISPATCH_QUEUE_CONCURRENT); for (int i = 0; i < 100 ; i ++ ) { dispatch_async(q, ^{ NSLog(@"%zd, ----- %zd",i ,[NSThread isMainThread]); }); }
并发同步
/** 并发同步 不开启线程 按顺序执行 1 线程标识符 2 线程状态, DISPATCH_QUEUE_CONCURRENT 并发队列 */ dispatch_queue_t q = dispatch_queue_create(queueName, DISPATCH_QUEUE_CONCURRENT); for (int i = 0; i < 100 ; i ++ ) { dispatch_sync(q, ^{ NSLog(@"%zd, ----- %zd",i ,[NSThread isMainThread]); }); }
串行同步
/** 串行同步 不开启线程 按顺序执行 */ dispatch_queue_t q = dispatch_queue_create(queueName, DISPATCH_QUEUE_SERIAL); for (int i = 0; i < 100 ; i ++ ) { dispatch_sync(q, ^{ NSLog(@"%zd, ----- %zd",i ,[NSThread isMainThread]); }); }
串行异步
/** 串行异步 开启子线程线程 按顺序执行 */ dispatch_queue_t q = dispatch_queue_create(queueName, DISPATCH_QUEUE_SERIAL); for (int i = 0; i < 100 ; i ++ ) { dispatch_async(q, ^{ NSLog(@"%zd, ----- %zd",i ,[NSThread isMainThread]); }); }
线程组
//创建线程 dispatch_queue_t q = dispatch_queue_create(queueName, DISPATCH_QUEUE_CONCURRENT); //创建线程组 dispatch_group_t g = dispatch_group_create(); dispatch_group_async(g, q, ^{ }); //添加任务到线程组 dispatch_group_async(g, q, ^{ }); dispatch_group_async(g, q, ^{ }); dispatch_group_async(g, q, ^{ }); /** 所有任务完成在 制定的线程通知任务完成 */ dispatch_group_notify(g, dispatch_get_main_queue(), ^{ });
单次执行
/* 只执行一次 */ static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ NSLog(@"只执行一次线程"); });
//通常应用于创建单例 保证线程安全