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]);

            });

       }

  • 相关阅读:
    LA 2038 Strategic game(最小点覆盖,树形dp,二分匹配)
    UVA 10564 Paths through the Hourglass(背包)
    Codeforces Round #323 (Div. 2) D 582B Once Again...(快速幂)
    UVALive 3530 Martian Mining(贪心,dp)
    UVALive 4727 Jump(约瑟夫环,递推)
    UVALive 4731 Cellular Network(贪心,dp)
    UVA Mega Man's Mission(状压dp)
    Aizu 2456 Usoperanto (贪心)
    UVA 11404 Plalidromic Subsquence (回文子序列,LCS)
    Aizu 2304 Reverse Roads(无向流)
  • 原文地址:https://www.cnblogs.com/ycg0808/p/5281540.html
Copyright © 2011-2022 走看看