线程GCD
2018-08-22 本文已影响0人
我是好宝宝_6966
本文只是学习他人知识点进行一定的总结巩固自己的理解
学习GCD看我就够了
iOS多线程全套
一、多线程的定义
计算机在运行一段程序的时候,会把该程序的CPU命令列配置到内存中,然后按照顺序一个一个执行命令列,这样1个CPU执行的CPU命令列为一条无分叉路径就是线程。
而有多条这样的执行指令列的路径存在时即为多线程。
二、实现多线程的4种方法
- pthreads
- NSThread
- GCD
- NSOperation & NSOperationQueuef
三、GCD
一些定义
-
Dispatch Queue:执行处理的等待队列
- Serial Dispatch Queue (串行队列) ——等待现在执行中处理结束再加入队列
只会当一个处理执行完了才会将下一个任务交给线程处理 - Concurre Dispatch Queue (并发队列) ——不等待现在执行中处理结束,直接加入队列
不需要等待前一个任务执行,几乎是同时交给线程处理的
- Serial Dispatch Queue (串行队列) ——等待现在执行中处理结束再加入队列
-
dispatch_queue_create 创建队列
-
同步与异步
1.dispatch_async:表示异步:将指定的Block“非同步”加入Dispatch Queue,不做任何等待
2.dispatch_sync:表示同步:将指定的Block“同步”的加入Dispatch Queue,在Block结束之前,dispatch_sync函数会一直等待 -
死锁:由于dispatch_sync会等待Block执行结束才会继续往下执行,所以会产生死锁的情况
dispatch_queue_t main_queue = dispatch_get_main_queue();
dispatch_sync(main_queue, ^{
NSLog(@"main queue");
});
NSLog(@"go on");
产生死锁的原因一般是 在串行队列中并且是在一个线程中同步往这个线程提交一个Block
- Dispatch Group(派发分组)
把任务分组。调用者在这组任务执行完毕后会得到通知,并做相应的处理。
创建方式有两种:
dispatch_group_t group = dispatch_group_create();
dispatch_group_enter(dispatch_group_t group);
dispatch_group_leave(dispatch_group_t group);
四、GCD的具体运用(更多使用可以看第二个链接)
//创建任务分组
dispatch_group_t group = dispatch_group_create();
//创建异步队列
dispatch_queue_t queue = dispatch_queue_create("test", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_enter(group);
dispatch_group_async(group, queue, ^{
dispatch_group_leave(group);
});
//所有队列里的任务执行完的通知
dispatch_group_notify(group, queue, ^{
dispatch_async(dispatch_get_main_queue(), ^{
});
});