多线程基础02-GCD

作者: CoderMacro | 来源:发表于2016-05-12 18:48 被阅读87次

    阅读原文--关注我的博客

    了解完多线基础概念和NSTread的基本使用后,本文介绍GCD的主要用方法

    GCD全称 : Grand Central Dispatch --伟大的中枢调度器


    CGD的优势: 多核并行运算提出解决方案,自动管理线程生命周期,自动利用更多的CPU内核

    1 两大核心概念

    • 任务 : 执行什么操作

    • 队列 : 用来存放任务

    • 一般使用步骤: 定制任务,将任务添加到队列,GCD会自动将队列中得任务取出,放到对应的线程中执行;任务取出顺序,遵循FIFO,先进先出,后进后出,

    2 用来执行任务的两个函数

    //同步执行
    dispatch_sync(dispatch_queue_t queue, ^(void)block)
    
    //异步执行
    dispatch_async(dispatch_queue_t queue, ^(void)block)
        * 参数 queue 队列
        * 参数 block 任务的代码块
    
    • 两者的区别
      • 同步 : 不开启新线程
      • 异步 : 会开启新线程

    3 队列的类型

    GCD的队列分为两大类型

    并发队列 (Concurrent Dispatch Queue) : 多个任务并发(同时)执行(自动开启多个线程同时执行),只有在异步函数下有效

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
    
      参数1 : 队列优先级    
      参数2 : 默认 0    
    

    串行队列 (Serial Dispatch Queue) : 一个任务执行完成再接着执行下一个

    dispatch_queue_t queue = dispatch_queue_create("C语言的字符串-队列标识", NULL);
    

    4 四种情况分析

    1. 异步执行 全局并发队列 添加5个任务
    • 分析 "常用这种方式"
      • 会不会创建线程 : 会创建5条子线程
      • 任务的执行方式 : 并发执行
    2. 异步执行 串行队列 添加5个任务
    • 分析 "偶尔常用这种方式"
      • 会不会创建线程 : 会创建1条子线程(不论添加多少个任务都只开启一条)
      • 任务的执行方式 : 顺序执行
    3. 同步执行 全局并发队列 添加5个任务
    • 分析 "不常用"
      • 会不会创建线程 : 不会开启新的子线程
      • 任务的执行方式 : 顺序执行,(因为只有一条线程所以只能顺序执行)
    4. 同步执行 串行队列 添加5个任务
    • 分析 "不常用"
      • 会不会创建线程 : 不会开启新的子线程
      • 任务的执行方式 : 顺序执行
    5. 特殊情况 -- 异步执行 串行主队列 添加5个任务
    // 获取主队列  这个也是一个串行队列
    dispatch_queue_t queue = dispatch_get_main_queue();
    
    • 分析
      • 会不会创建线程 : 不会开启新的线程 因为主队列对应的线程就是主线程,主线程只能有一个
      • 任务的执行方式 : 顺序执行

    5 GCD线程之间的通信

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        // 耗时操作
        dispatch_async(dispatch_get_main_queue(), ^{
        // 主线程刷新UI
        });
    });
    

    6 延迟执行

    1 下面这种方式会卡住主线程

    [NSThread sleepForTimeInterval:2];
    

    2 下面这种方式不会卡住主线程,但是不能改变延迟后代码执行的线程

    [self performSelector:@selector(download:) withObject:@"下载中" afterDelay:2];
    

    3 这种GCD的方式,比较好,不卡住主线程,也能随意定制延迟后代码执行的线程

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)("时间"* NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        // 延迟后要执行的代码
    });
    

    7 一次执行

    一次性执行的代码主要用来创建单例模式

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        // 只执行一次的代码
    });
    

    8 队列组

    队列组的功能主要是,当多个任务需要同时执行,且所有任务都执行完毕后,还要触发执行别的任务的时候用到。

    //获取队列组
    dispatch_group_t group = dispatch_group_create();
        
    //队列组添加异步执行任务
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
    dispatch_group_async(group, queue, ^{
    // 任务1代码 
    });
    .
    添加多个任务
    .
    dispatch_group_async(group, queue, ^{
    // 任务n代码 
    });
    .
    dispatch_group_notify(group, queue, ^{
    // 所有任务执行完后唤醒需要执行的代码        
    });
    

    相关文章

      网友评论

        本文标题:多线程基础02-GCD

        本文链接:https://www.haomeiwen.com/subject/wveprttx.html