zoukankan      html  css  js  c++  java
  • GCD概念理解:同步异步,并行串行

    GCD核心概念:

    1,任务和队列。

    任务:要做什么

    队列:存放任务。

    GCD使用步骤:

    1,创建队列

    2,封装任务,把任务添加到队列中。 

    封装任务的函数:

    同步函数:  dispatch_sync  该函数不具备开辟线程的能力,不能开辟线程。

          任务执行的方式: 同步

    异步函数:dispatch_async 该函数具备开辟线程的能力,可以开辟线程。

          任务执行的方式: 异步

    GCD中的队列:

    1, 并发队列:任务可以同时执行

      “只要第一个任务取出来之后,不用等待执行完毕,就可以接着取第二个任务”

    2,串行队列:任务必须一个接一个的执行

      “第一个任务取出来之后,必须等待该任务执行完,才可以接着取第二个任务”

     异步函数+并发队列: 会开辟多条子线程,所有的任务并发执行(开几条线程不是由任务的数量决定的,是GCD内部自动决定的)

    异步函数+串行队列:会开辟一条子线程,所有的任务在该子线程中串行执行。

    同步函数+并发队列:不会开辟子线程,所有的任务在当前线程中串行执行。

    同步函数+串行队列:不会开辟子线程,所有的任务在当前线程中串行执行。

    代码示例:

    //创建串行队列

        dispatch_queue_t queue = dispatch_queue_create("com.dahuatech.lsp", DISPATCH_QUEUE_SERIAL);

    //封装任务,将任务添加到队列中

        dispatch_async(queue, ^{

            NSLog(@"1---%@",[NSThread currentThread]);

        });

        dispatch_async(queue, ^{

            NSLog(@"2---%@",[NSThread currentThread]);

        });

        dispatch_async(queue, ^{

            NSLog(@"3---%@",[NSThread currentThread]);

        });

        dispatch_async(queue, ^{

            NSLog(@"4---%@",[NSThread currentThread]);

        });

        dispatch_async(queue, ^{

            NSLog(@"5---%@",[NSThread currentThread]);

        });

    上面的代码只会开辟一条线程,按顺序串行执行 

    2019-02-16 22:10:50.024775+0800 下载图片[5657:173638] 1---<NSThread: 0x600001c201c0>{number = 3, name = (null)}

    2019-02-16 22:10:50.024912+0800 下载图片[5657:173638] 2---<NSThread: 0x600001c201c0>{number = 3, name = (null)}

    2019-02-16 22:10:50.025098+0800 下载图片[5657:173638] 3---<NSThread: 0x600001c201c0>{number = 3, name = (null)}

    2019-02-16 22:10:50.025219+0800 下载图片[5657:173638] 4---<NSThread: 0x600001c201c0>{number = 3, name = (null)}

    2019-02-16 22:10:50.025346+0800 下载图片[5657:173638] 5---<NSThread: 0x600001c201c0>{number = 3, name = (null)}

     示例二: 

    //创建并发队列

        dispatch_queue_t queue = dispatch_queue_create("com.dahuatech.lsp", DISPATCH_QUEUE_CONCURRENT);

    //封装任务,将任务添加到队列中

        dispatch_async(queue, ^{

            NSLog(@"1---%@",[NSThread currentThread]);

        });

        dispatch_async(queue, ^{

            NSLog(@"2---%@",[NSThread currentThread]);

        });

        dispatch_async(queue, ^{

            NSLog(@"3---%@",[NSThread currentThread]);

        });

        dispatch_async(queue, ^{

            NSLog(@"4---%@",[NSThread currentThread]);

        });

        dispatch_async(queue, ^{

            NSLog(@"5---%@",[NSThread currentThread]);

        });

    2019-02-16 22:19:59.202672+0800 下载图片[5927:185481] 4---<NSThread: 0x60000258d800>{number = 6, name = (null)}

    2019-02-16 22:19:59.202704+0800 下载图片[5927:185479] 2---<NSThread: 0x6000025b3140>{number = 4, name = (null)}

    2019-02-16 22:19:59.202731+0800 下载图片[5927:185478] 3---<NSThread: 0x6000025b3200>{number = 5, name = (null)}

    2019-02-16 22:19:59.202752+0800 下载图片[5927:185480] 1---<NSThread: 0x6000025b2ac0>{number = 3, name = (null)}

    2019-02-16 22:19:59.203265+0800 下载图片[5927:185508] 5---<NSThread: 0x6000025b3400>{number = 7, name = (null)}

     因为使用的都是异步函数dispatch_async,都有开辟线程的能力,并发队列会开辟多条线程去执行不同的任务。

    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);这个是全局并发队列,和创建的并发队列DISPATCH_QUEUE_CONCURRENT没有区别。

  • 相关阅读:
    LVS三种模式配置及优点缺点比较
    LVS负载均衡-DR模式
    Nginx反向代理和负载均衡
    LNMP(centos7.6 Nginx1.16 MySQL5.7 PHP7 )
    Nginx常用模块
    表演中的晴天
    迷雾中前行
    mysql Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nona
    npm install -g cnpm --registry=https://registry.npm.taobao.org
    ubuntu16 安装elasticsearch6.3问题
  • 原文地址:https://www.cnblogs.com/dashengios/p/10389310.html
Copyright © 2011-2022 走看看