*
1. 主队列特点 :主队列中的任务,只有主线程空闲的时候才会被调度
2. 主队列又叫全局串行队列,程序启动的时候就创建了主队列,在使用的时候不需要创建,直接GET.
2. 主队列中的任务一定是要在主线程执行的.
*/
pragma mark - 主队列+同步任务
// 不能向主队列中添加同步任务,会死锁
- (void)GCDDemo2
{
// 获取主队列
dispatch_queue_t queue =dispatch_get_main_queue();
dispatch_async(dispatch_get_global_queue(0, 0), ^{
// 创建同步任务
void (^task)() = ^
NSLog(@"%@",[NSThreadcurrentThread]);
};
// 将同步任务添加到主队列
dispatch_sync(queue, task);
// NSLog(@"hello");
});
}
注意:因为主队列的任务是当主线程空闲的时候才会调用,所以将同步任务添加到主队列时,会造成造成死锁;
•死锁的原因
•主队列:如果主线程正在执行代码,就不调度任务
•同步执行:如果第一个任务没有执行,就继续等待第一个任务执行完成,再执行下一个任务此时互相等待,程序无法往下执行(死锁)
pragma mark - 主队列+异步任务
// 不开线程
- (void)GCDDemo1
{
// 获取主队列
dispatch_queue_t queue =dispatch_get_main_queue();
// 创建异步任务
void (^task)() = ^{
NSLog(@"%@",[NSThreadcurrentThread]);
};
// 将异步任务添加到主队列
// 异步任务不占用主线程
dispatch_async(queue, task);
NSLog(@"hello");
}
全局并发队列本质就是并发队列
dispatch_get_global_queue(0,0);
全局队列和并发队列的区别
并发队列有名称,可以跟踪错误,全局队列没有
在ARC中不需要考虑释放内存, dispatch_release(q);不允许调用。在MRC中需要手动释放内存,并发队列是create创建出来的 在MRC中见到create就要release,全局队列不需要release(只有一个)
一般我们使用全局队列,因为使用起来更加简单
/// 演示 全局并发队列
- (void)GCDDemo
{
// 获取全局并发队列
// 程序一启动就创建好的
// 参数2 : 苹果不知道这个参数干什么的,预留着以后升级用的.
// 参数1 : iOS7.0及以前,代表队列的优先级,iOS8.0及以后,代表服务质量
// 开发中建议使用全局并发队列
dispatch_queue_t global_queue = dispatch_get_global_queue(0, 0);
// DISPATCH_QUEUE_PRIORITY_DEFAULT
// QOS_CLASS_UNSPECIFIED
// 创建自定义的并发队列
dispatch_queue_t con_queue = dispatch_queue_create("cz", DISPATCH_QUEUE_CONCURRENT);
// dispatch_release(con_queue);
}
线程间通信
#pragma mark - 线程间的通信
- (void)GCDDemo4
{
dispatch_async(dispatch_get_global_queue(0, 0), ^{
// 耗时操作
NSLog(@"努力下载... %@",[NSThread currentThread]);
// 回到主线程更新UI
dispatch_async(dispatch_get_main_queue(), ^{
// 回到其他线程
NSLog(@"更新UI... %@",[NSThread currentThread]);
});
});
}