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

    GCD:是纯C语言写的,是苹果公司为多核的并行运算提出的解决方案。

    GCD的两个核心概念: - 任务 - 队列

    将任务添加到队列中 GCD会自动将队列中的任务取出,放到对应的线程中执行 任务的取出遵循队列的FIFO原则:先进先出,后进后出 - 创建串行队列

    // "WE" 为线程的名称
    // DISPATCH_QUEUE_SERIAL 串行
    dispatch_queue_t queue = dispatch_queue_create("WE",DISPATCH_QUEUE_SERIAL);
    // 也可以这样设置 串行默认为NULL
    dispatch_queue_t queue = dispatch_queue_create("WE", NULL)

    -创建队列

    //DISPATCH_QUEUE_CONCURRENT 并行
    dispatch_queue_t queue = dispatch_queue_create("WE", DISPATCH_QUEUE_CONCURRENT);

    - 异步执行

    dispatch_async(queue, ^{
    // 
    });

    - 同步执行

    dispatch_sync(queue, ^{
    //
    });

    GCD的几种用法 - 串行队列,同步执行-----不开线程,同步执行

    dispatch_queue_t queue = dispatch_queue_create("WE",DISPATCH_QUEUE_SERIAL);
        for (int i = 0; i < 5; ++i) {
            // 同步执行
            dispatch_sync(queue, ^{
                NSLog(@"%d--%@",i,[NSThread currentThread]);
            });
        } 

    - 串行队列,异步执行-----开一个线程,顺序执行
    dispatch_queue_t queue = dispatch_queue_create("WE",DISPATCH_QUEUE_SERIAL);
        for (int i = 0; i < 5; ++i) {
            // 异步执行
            dispatch_async(queue, ^{
                NSLog(@"%d--%@",i,[NSThread currentThread]);
            });
    }
    - 并行队列,异步执行-----开多个线程,异步执行
        dispatch_queue_t queue = dispatch_queue_create("WE", DISPATCH_QUEUE_CONCURRENT);
        
        for (int i = 0; i < 10; ++i) {
    //        // 异步执行
            dispatch_async(queue, ^{
                NSLog(@"异步>%d--%@",i,[NSThread currentThread]);
            });
        } 

    - 并行队列,同步执行-----不开线程,顺序执行

        dispatch_queue_t queue = dispatch_queue_create("WE", DISPATCH_QUEUE_CONCURRENT);
        for (int i = 0; i < 10; ++i) {
            // 同步执行
            dispatch_sync(queue, ^{
                NSLog(@"同步>%d--%@",i,[NSThread currentThread]);
            });
        } 

    - 主队列,异步任务-----不开线程,同步执行

        dispatch_queue_t queue = dispatch_get_main_queue();
        for (int i = 0; i < 5; ++i) {
            //        // 异步执行
            dispatch_async(queue, ^{
                NSLog(@"%d--%@",i,[NSThread currentThread]);
            });
        }

    - 主队列,同步执行-----程序执行不出来(死锁) 死锁的原因,当程序执行到下面这段代码的时候

    1) 主队列:如果主线程正在执行代码,就不调度任务

    2) 同步执行:如果第一个任务没有执行,就继续等待第一个任务执行完成,再执行下一个任务,此时互相等待,程序无法往下执行(死锁)

    - 全局队列(本质就是并发队列)

    //第一个参数:iOS7和iOS8中适配此参数 可以直接传入0
    //第二个参数:为将来保留使用,始终传入0
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
        for (int i = 0; i < 5; ++i) {
            // 并行执行
            dispatch_async(queue, ^{
                NSLog(@"%d--%@",i,[NSThread currentThread]);
            });
    }

     

  • 相关阅读:
    Class类和ClassLoader类的简单介绍
    【IDEA】IDEA中配置tomcat虚拟路径的两种方法
    layui利用jQuery设置下拉列表的值
    SpringMVC可以配置多个拦截后缀*.action和.do等
    【IDEA】IDEA设置新建文件的模板
    【IDEA】与Eclipse "Link with Editor"等价功能设置
    Java集合详解
    【Git】git clone与git pull区别
    使用maven打包项目遇到错误: http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
    自动阈值分割-场景中直线个数的检测
  • 原文地址:https://www.cnblogs.com/Mr-Ygs/p/4764973.html
Copyright © 2011-2022 走看看