CGD全局并发队列和主队列的应用

来源:互联网 发布:厦门众途软件 编辑:程序博客网 时间:2024/05/21 07:57

*
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]);        });    });}
0 0
原创粉丝点击