• 同步sync 异步async


    线程中

    同步任务是串行队列,也就是按顺序执行。

    同步任务:不会开辟新的线程,它是在当前线程执行的。

    dispatch 调度   GCD里面的函数都是以dispatch开头的。

    同步任务  步骤:

    1.创建一个串行队列    参数:1.队列标签   2.队列属性   DISPATCH_QUEUE_SERIAL它是个宏,是个NULL

    dispatch_queue_t queue = dispatch_queue_create("ZPqueue",DISPATCH_QUEUE_SERIAL);

    2.同步执行任务  一般只要使用同步执行,串行队列对添加的同步任务,就会马上执行。

    dispatch_sync(queue,^{NSLog(@"%@",[NSThread currentThread]);});

    异步执行:肯定会开新线程,而且只会开一个线程,所有任务都会在这个新的线程里面执行。

    异步任务 步骤:

    dispatch_queue_t queue = dispatch_queue_create("ZPasyncQueue",DISPATCH_QUEUE_SERIAL);

    2.同步执行任务  一般只要使用同步执行,串行队列对添加的同步任务,就会马上执行。

    dispatch_async(queue,^{NSLog(@"%@",[NSThread currentThread]);});

    并发队列:会开多个线程,并且它要开多少个线程是我们无法控制的。

    dispatch_queue_t queue = dispatch_queue_create("ZPasyncQueue",DISPATCH_QUEUE_CONCURRENT);

    2.同步执行任务  一般只要使用同步执行,串行队列对添加的同步任务,就会马上执行。

    dispatch_async(queue,^{NSLog(@"%@",[NSThread currentThread]);});

    总结:

    核心概念:

    任务:block

    队列:把任务放到队列里面,队列遵循先进先出原则。

    串行队列:按顺序执行,当前任务执行完毕才会执行下一个目标任务。

    并发队列:同时执行多个任务(可以同时去除多个任务,只要有线程)。

    串行队列同步执行:不开线程,在原来的线程里面一个一个的按顺序执行。

    串行队列异步执行:开一条线程,在新的线程里面按顺序执行。

    并发队列异步执行:开多个线程,并发执行(不一定是一个一个的执行,可能会是多个一起执行)。

    并发队列同步执行:不开线程,在原来的线程里面一个一个按顺序执行。

    阶段性总结:

    1.开不开线程,由执行任务方法决定,同步不开线程,异步肯定开线程。

    2.开多少线程,由队列决定,串行最多开一个线程,并发可以开多个线程。具体开多少个由GCD底层决定,程序员不能控制。

    **主队列**

    // 主队列  :专门负责在主线程上调度任务,不会再子线程调度任务,在主队列不允许开新线程

    // 主队列:不允许开新线程

    // 异步执行:会开新线程,在新线程执行。

    // 结果:不卡线程,只能在主线程上面运行,顺序执行。

    步骤:

    获得主队列   --- 程序一旦启动至少有一个主线程--->一开始就会创建主队列

    -(void)test1{

       // 1.获得主队列 

      dispatch_queue_t queue = dispatch_get_main_queue();

      // 2.异步执行任务

        for(int i = 0; i < 10; i++)

        {

         NSLog(@"调度前-----");

         // 异步:把任务放到主队列里,但是不需要马上执行。它跟for循环没有关系,test1执行完毕之后他会全部执行完成。

          dispatch_async(queue,^{

               NSLog(@"%@ %d",[NSThread currnetThread],i);

             });

         }

         NSLog(@"完成---");  // 在这里执行完毕之后会执行主队列的东西。

    }

    注意:异步执行:异步任务不需要马上执行,只是先把任务放到主队列,等线程有空再去执行,就是等到test1执行结束了,主线程有空闲了就去执行

    **同步任务**

    -(void)test2{

       // 1.获得主队列 

      dispatch_queue_t queue = dispatch_get_main_queue();

      // 2.异步执行任务

        for(int i = 0; i < 10; i++)

        {

         NSLog(@"调度前-----");

         // 异步:把任务放到主队列里,但是不需要马上执行。它跟for循环没有关系,test1执行完毕之后他会全部执行完成。

          dispatch_sync(queue,^{

               NSLog(@"%@ %d",[NSThread currnetThread],i);

             });

         }

         NSLog(@"完成---");  // 在这里执行完毕之后会执行主队列的东西。

    }

    注意:这个任务是执行不下去的,因为同步任务需要马上执行,但是主线程上面正在执行test2,所以需要等待test2执行完毕之后才能执行同步任务,但是test2在等待这个同步任务执行结束,这样就造成主线程阻塞,产生死锁。谁也没有办法往下执行。

    并发队列:

    -(void)test3

    {

      // 例子:有一个小说网站,必须登陆才能下载小说

      // 分析:上面是有三个任务---1,用户登录 2,下载小说a  3,下载小说b  

         // 所以这个小说网站是通过同步执行。

      dispatch_queue_t queue = dispatch_queue_create("cz",DISPATCH_QUEUE_CONCURRENT);

      dispatch_sync(queue,^{

        NSLog(@"用户登录%@",[NSThread currentThread]);

      }); 

    }

    **全局队列**

    /**

    全局队列跟并发队列的区别

    1.全局队列:没有名称,并发队列有名称 

    2.全局队列,是供所有的应用程序共享

    3.再mrc开发,并发队列创建完成,需要释放;全局队列不需要管理。

    */

    -(void)test4

    {

      // 获取全局队列

      // DISPATCH_QUEUE_PRIORITY_HIGH 2 高级优先级  IOS7.0

      // DISPATCH_QUEUE_PRIORITY_DEFAULT 0  默认优先级 IOS7.0

      // DISPATCH_QUEUE_PRIORITY_LOW (-2) 低优先级 IOS7.0

      // DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN 后台优先级  IOS7.0

      // IOS8.0 QOS_CLASS_DEFAULT 0 ;

         // 参数:1.优先级 (一般写 0  可以适配ios7盒ios8)2.预留参数(也是直接写0)

      dispatch_queue_t  queue = dispatch_get_global_queue  queue(0,0);

      // 添加异步任务

          dispatch_async(queue,^{

        NSLog(@"用户登录%@",[NSThread currentThread]);

      }); 

    }

    ****************************************************************** 

    **      *  全局并行队列    * 手动创建串行队列   *  主队列      *

    ****************************************************************** 

    **同步并行  *   没有开启新线程    * 没有开启新线程    *  死锁         *

          *     串行执行任务       * 串行执行任务                *

    **异步    *   有开启新线程     * 有开启新线程     *  没有开启新线程  *

          *     并行执行任务     * 串行执行任务     *  串行执行任务     *

    ****************************************************************** 

    队列的选择:

    串行队列异步执行

    --开一条线程,顺序执行。

    --效率不高,执行的比较慢,资源占用小->省电

    使用场合:

    一般网络连接(3g 4g)对性能要求不会很高

    并发队列异步执行

    --开启多条线程,并发执行

    --效率高,执行快。资源占用大->费电。

    使用场合:

    -网络wifi   或者需要很快响应,要求用户体验非常流畅。

    -对任务执行顺序没有要求

    同步任务:一般只会在并发队列,需要阻塞后续任务,必须等待同步任务执行完毕,再去执行其他任务。“依赖”关系。

    从子线程回到主线程

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{

      // 执行耗时的异步操作。。。。

      dispatch_async(dispatch_get_main_queue(),^{

       // 回到主线程

      });

    });

  • 相关阅读:
    高德地图js开发,给城市某个区添加颜色
    threejs 实现易拉罐换肤功能
    React 跨页面保留前一页状态的一种实现方法
    nginx 解决客户端跟服务跨域问题
    React图片预览组件,支持缩放、旋转、上一张下一张功能
    h5 高德地图开发 谷歌浏览器定位失败解决方案
    echarts点击省份显示对应的省份
    sec:authorize 标签 通过不通过权限例子
    择左边多选框的值移动到右边多选框
    更改css element.style
  • 原文地址:https://www.cnblogs.com/pengpengzhang/p/4779088.html
Copyright © 2020-2023  润新知