zoukankan      html  css  js  c++  java
  • ios多线程 -- GCD介绍

    GCD (纯C语言) 全称 Grand Central Dispatch,可译为“伟大的中枢调度器”

    优点:
    (1) GCD是为多核并行运算提出的解决方案
    (2) GCD会自动利用更多的CPU内核(比如双核、四核)
    (3) GCD会自动管理线程的生命周期(创建线程、调度任务、销毁线程)
    (4) 程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码

    核心概念:
    (1) 任务(block):执行什么任务
    (2) 队列(queue):用来存放任务

    使用步骤:
    (1) 定制任务:确定要执行的操作
    (2) 将任务添加到队列中: GCD 会自动将队列中的任务取出,放到对应的线程来执行;任务的取出遵守队列的 FIFO 原则 (先进先出).

    GCD执行任务的常用函数
    (1) 用同步的方式

    /**
         *  参数说明
         *  @param queue 队列
         *  @param void  任务
         */
        dispatch_sync(<#dispatch_queue_t queue#>, <#^(void)block#>)

    (2) 用异步的方式

    dispatch_async(<#dispatch_queue_t queue#>, <#^(void)block#>)

    同步异步区别:
    (1) 同步: 只能在当前线程中执行, 不具备开启线程的能力
    (2) 异步: 可以在新线程中执行, 具备开启线程的能力.

    GCD队列的类型(3种)
    并发队列(全局队列):可以让对个任务并发(同时)执行, 自动开启多个线程,同时执行任务;(并发的功能只能在异步执行的时候才有效).

    /**
         * 优先级
         * DISPATCH_QUEUE_PRIORITY_HIGH 2 // 高
         * DISPATCH_QUEUE_PRIORITY_DEFAULT 0 // 默认(中)
         * DISPATCH_QUEUE_PRIORITY_LOW (-2) // 低
         * DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN // 后台
         */
        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    串行队列:让任务一个接一个执行,一个任务执行完毕,才能执行下一个任务.

    dispatch_queue_t queue = dispatch_queue_create("xiaocai", NULL);
    //dispatch_release(queue); // 非ARC需要释放手动创建的队列

    串行队列的特殊情况:主队列:

    dispatch_get_main_queue()

    补充:
    同步和异步:主要影响能不能开启新的线程

    • 同步:不具备开启新线程的能力
    • 异步:具备开启线程的能力

    并发和串行主要影响任务的执行方式

    • 并发: 多个任务并发(同时)执行
    • 串行:一个任务执行完毕,下一个任务才开始执行.

    组合方式
    异步 并发队列(最常用)

    /** 
        异步(dispatch_async)  并发队列(全局队列)(最常用)
        会创建线程,一次开多条, 并行的执行任务
     */
    - (void)createAsynGload{
        //创建并发队列(全局队列)
        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        dispatch_async(queue, ^{
            [self downLoad:@"http://ThreadA"];
        });
    
        dispatch_async(queue, ^{
            [self downLoad:@"http://ThreadB"];
        });
    
        dispatch_async(queue, ^{
            [self downLoad:@"http://ThreadD"];
        });
    
        dispatch_async(queue, ^{
            [self downLoad:@"http://ThreadE"];
        });
    
        dispatch_async(queue, ^{
            [self downLoad:@"http://ThreadF"];
        });
    
        dispatch_async(queue, ^{
            [self downLoad:@"http://ThreadG"];
        });
    }
    

    异步并发

    异步 串行队列(偶尔用)

    /**
     异步(dispatch_async)  串行队列(有时用)
     会创建线程,一般开一条, 串行的执行任务
     */
    - (void)createAsynQueue{
        //创建队列(串行队列,依次执行)
        dispatch_queue_t queue = dispatch_queue_create("xiaocai", NULL);
    
        dispatch_async(queue, ^{
            [self downLoad:@"http://ThreadA"];
        });
    
        dispatch_async(queue, ^{
            [self downLoad:@"http://ThreadB"];
        });
    
        dispatch_async(queue, ^{
            [self downLoad:@"http://ThreadD"];
        });
    
        dispatch_async(queue, ^{
            [self downLoad:@"http://ThreadE"];
        });
    
        dispatch_async(queue, ^{
            [self downLoad:@"http://ThreadF"];
        });
    
        dispatch_async(queue, ^{
            [self downLoad:@"http://ThreadG"];
        });
    
    }
    

    异步串行

    异步 主队列(经常用)

    /**
     异步(dispatch_async)  主队列(很常用)
     不会创建线程,在主线程中执行任务
     */
    - (void)createAsynMainQueue{
        dispatch_queue_t mianQueue = dispatch_get_main_queue();
        dispatch_async(mianQueue, ^{
            [self downLoad:@"http://ThreadA"];
        });
    
        dispatch_async(mianQueue, ^{
            [self downLoad:@"http://ThreadB"];
        });
    
        dispatch_async(mianQueue, ^{
            [self downLoad:@"http://ThreadD"];
        });
    
        dispatch_async(mianQueue, ^{
            [self downLoad:@"http://ThreadE"];
        });
    
        dispatch_async(mianQueue, ^{
            [self downLoad:@"http://ThreadF"];
        });
    
        dispatch_async(mianQueue, ^{
            [self downLoad:@"http://ThreadG"];
        });
    }
    

    异步主队列

  • 相关阅读:
    微信二维码 场景二维码 用于推送事件,关注等 注册用户 ,经过测试
    简单的 Helper 封装 -- CookieHelper
    简单的 Helper 封装 -- SecurityHelper 安全助手:封装加密算法(MD5、SHA、HMAC、DES、RSA)
    Java反射机制
    Windows Azure Web Site (13) Azure Web Site备份
    Windows Azure Virtual Machine (1) IaaS用户手册
    Windows Azure Web Site (1) 用户手册
    Windows Azure Web Site (12) Azure Web Site配置文件
    Windows Azure Web Site (11) 使用源代码管理器管理Azure Web Site
    Windows Azure Web Site (10) Web Site测试环境
  • 原文地址:https://www.cnblogs.com/xiaocai-ios/p/7779777.html
Copyright © 2011-2022 走看看