zoukankan      html  css  js  c++  java
  • GCD基础

    一 GCD 与NSOperation 

    GCD -- (iOS4.0)多线程解决方案

        将任务(block)添加到队列(串行,并行(全局队列)),指定执行任务的方法。(同步,异步)

        拿到dispatch_get_main_queue,线程之间的通信

        NSOperation -- (iOS2.0)  (后经苹果改造)

        将操作添加到队列里

        [NSOperationQueue mainQueue]  获取主队列,将任务添加到主队列,就会在主线程中执行

        NSOperation可以设置最大并发数(用GCD处理,比较麻烦)

        可以暂停可以继续,也就是挂起操作

        取消所有的任务

        设置依赖关系

    二 什么是GCD

      GCD本身是苹果公司为多核的并发运算提出的解决办法,GCD工作时会自动利用更多的处理器核心,以充分利用更强大的机器.它是基于C语言的

      如果使用GCD,完全由系统管理线程,我不需要手动编写线程代码,只需定义想要执行的任务,然后将其添加到适当的调度队列.GCD会负责创建线程,调度你的任务,系统直接提供线程管理

    三创建

    (1)//串行队列:一个一个执行

    //同步操作:不开启新的线程

    //执行结果:不开启新的线程,一个一个顺序执行

    {

      //label:队列名

        //attr:队列属性(串行,并发)

        //DISPATCH_QUEUE_SERIAL 串行

        //DISPATCH_QUEUE_CONCURRENT 并发

        //#define DISPATCH_QUEUE_SERIAL NULL

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

        NSLog(@"开始");

        //同步操作

        //操作任务:block

        dispatch_sync(queue, ^{

            //打印当前线程

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

        });

          NSLog(@"结束");

    }

    (2)//串行队列:一个一个执行

    //异步操作:会开启新的线程

    //执行结果:开启一个新的线程,在新开辟的线程中执行任务,不是立刻执行

    {

    dispatch_queue_t queue = dispatch_queue_create("com.bjsxt", NULL);

        NSLog(@"开始");

       for (NSInteger i = 0 ; i < 10; i ++ ) {

             //异步请求

            dispatch_async(queue, ^{

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

            });

        }

         NSLog(@"结束");

     }

    (3)

    //并发队列:多个线程同时执行

    //异步操作:会开启新的线程

    //执行结果:会开辟新的线程,在新开辟的线程中执行任务,任务的完成顺序是无序的,不是立刻执行

    //开启并发队列 

    {

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

      NSLog(@"开始");

       for (NSInteger i = 0 ; i < 10; i ++ ) {

            //执行异步操作

            dispatch_async(queue, ^{

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

            });

        }

       NSLog(@"结束");}

    (4)

    //并发队列:多个线程同时执行

    //同步操作:不会开启新的线程

    //执行结果:不会开启新的线程,立即执行

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

      NSLog(@"开始");

    (5)

      // 主队列就是一种特殊的串行队列

        // 特点:专门负责在主线程上调度任务,不会再子线程中去调度任务,无论是同步或异步中调用任务都只会在主线程上面执行

    {

        dispatch_queue_t queue = dispatch_get_main_queue();

       NSLog(@"开始");

       for (NSInteger i = 0; i < 10; i ++) {

            //主队列执行异步操作,异步操作有一个等待的过程

            dispatch_async(queue, ^{

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

            });

        }

      for (NSInteger i = 0 ; i < 10; i ++ ) {

           dispatch_sync(queue, ^{

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

            });

        }

       NSLog(@"结束");

     }

    (6)

     //在主队列里执行同步操作,产生死锁

        //原因:同步线程等待主线程结束,才会执行任务。主线程等待同步立即执行,才会执行下一个任务。

    { dispatch_queue_t queue = dispatch_get_main_queue();

       NSLog(@"1");

        dispatch_sync(queue, ^{

            NSLog(@"2");

        });

       NSLog(@"3");

     }

    (7)

    //全局队列

        //identifier  队列优先级

        //flags  苹果预留的参数(没有用)

        //DISPATCH_QUEUE_PRIORITY_DEFAULT  一般使用默认优先级

      //    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

       //默认是并发队列,dispatch_get_global_queue用的多

       dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

        for (NSInteger i = 0; i < 10; i++) {

           //并发加异步

            dispatch_async(queue, ^{

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

            });

       }

  • 相关阅读:
    使用aws和tomcat搭建服务器过程中的一些坑.
    10
    9
    8
    7
    6
    5
    hihoCoder 1582 Territorial Dispute 【凸包】(ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛)
    hihoCoder 1584 Bounce 【数学规律】 (ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛)
    hihoCoder 1578 Visiting Peking University 【贪心】 (ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛)
  • 原文地址:https://www.cnblogs.com/ycg0808/p/5281540.html
Copyright © 2011-2022 走看看