ios多线程--GCD
(Grand Central Dispatch)多线程优化技术,GCD的使用离不开Dispatch
1、什么是GCD
是一套底层API,基于C语言开发的多线程机制,提供了新的模式编写并发执行的程序;
2、GCD特点
(1)允许将一个程序分为多个单一的任务,提到工作队列当中串行或者并发执行
(2)配合了Block使用起来更加灵活
(3)自动管理线程的生命周期(创建线程、调度任务、线程销毁)完全不用我们管理,只需要告诉它任务是什么就行
(4)为多核的并行运算提出了解决方案,能够合理的利用CPU内核(比如双核、四核)
3、什么是Queue队列
GCD使用了队列的概念,解决了NSThread难于管理的问题,队列实际上就是数组的概念,通常是把要执行的任务放到队列里就ok了
4、Queue特点
(1)按顺序执行,先进先出
(2)队列可以管理多线程、管理任务、设置主线程
(3)GCD的队列是任务的队列、而不是线程的队列
5、什么是任务
任务即操作:你想要干什么、说白了就是一段代码、在GCD中就是一个Block
任务的执行方式:
(1)同步执行:只要是同步、都会在当前线程执行、不会另开线程
(2)异步执行:只要是异步、都会开启新线程、在新开启的线程中执行
6、什么是串行队列(排队)
依次执行每一个任务
7、什么是并行队列(一起跑、谁快谁先)
好像所有任务都是在同一时间段执行的
8、都有哪些队列
主队列(MainQueue)、全局队列(Global Queue)、自定义的(Queue)
GCD的任务队列 (三种)
串行队列,同步任务,不需要新建子线程
串行队列,异步任务,需要一个子线程,线程的创建和回收不需要程序员参与
并行队列,同步任务,不需要创建线程
并行队列,异步任务,有多少个任务,就开N个线程执行(不可控制)
dispatch 它是GCD技术常用变量和函数的前缀名
1、自定义队列
2、获取全局队列
3、获取主队列
(1)自定义队列
0、创建队列
参数一、给一个运行标记,可以为NULL
参数二、属性,一般为NULL
dispatch_queue_t myQueue = dispatch_queue_create("myQueue", NULL);
1、同步(只要是同步就不会开线程)
dispatch_sync
2、异步
dispatch_async
任务在同一个队列里面都是串行的、只要是异步、肯定要开线程
3、多队列
dispatch_async
每个线程的任务先执行一步、在依次(随机)执行第二步……
4、组队列
能够实现全部任务都执行完后再执行某事
(1)将事件统一添加到组里
dispatch_group_async(group, queue1, ^{
(2)组内所有方法执行完毕,就会调用通知
dispatch_group_notify(group, queue4, ^{
(2)全局队列
1、获取 dispatch_get_global_queue
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)
参数一:运行级别标识(高2,默认0,低-2,后台)
参数二:,标记,一般给个0就可以
2、特点:
1.可以同时运行多个任务,每个任务的启动时间是按照加入queue的顺序执行的
2.全局队列能够实现并行,只要是异步执行,就会开启线程(虽然都在全局队列里)
3.我们不能自己创建,只能获取和调度
(3)主队列
1、获取主队列的方法
dispatch_async(dispatch_get_main_queue(), ^{
2、主队列常见错误(sync同步等待主队列、主队列等待sync返回、所以会卡死)
NSLog(@"1");
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"2");
});
NSLog(@"3");