zoukankan      html  css  js  c++  java
  • GCD线程方式

      GCD的线程方式是以C语言为基础的多线程技术,总体上分为串行队列和并行队列两种实现方式。

      GCD串行队列:

        

    #param mark -TWThread.gcd.seral是新创建的队列的名字,主要作用体现在断点调试阶段,可以根据名字判断线程的队列
    //DISPATCH_QUEUE_SERIAL,标志着这个队列是串行队列,DISPATCH_QUEUE_CONCURRENT,表示为并行队列
    -(void)gcdSeral
    {
        //创建一个串行队列
        dispatch_queue_t q = dispatch_queue_create("TWThread.gcd.seral", DISPATCH_QUEUE_SERIAL);
        //同步任务顺序执行(串行队列中的同步任务,也只能是顺序执行的,没有意义)
    //    dispatch_sync(q, ^{
    //        NSLog(@"%@",[NSThread currentThread]);
    //    });
        //串行队列中的异步任务会新建一个线程(串行队列中的异步任务是在IOS开发中最常用的方式)
        for (int i = 0; i < 10; i++) {
            dispatch_async(q, ^{
                NSLog(@"%@",[NSThread currentThread]);//打印当前线程
            });
        }
    }
    

      GCD并行队列:

        

    #pragma mark -并行队列
    -(void)gcdConcurrent
    {
        //特点:没有队形,执行顺序程序猿不能控制
        //创建一个并行队列
        dispatch_queue_t q = dispatch_queue_create("TWThread.gcd.concurrent", DISPATCH_QUEUE_CONCURRENT);
        //并行队列中执行同步任务也只能在主线程中进行
        //并行队列中执行异步任务会创建多个线程(在多线程中不容易进行优先级的控制,主要原因是使用C语言来实现优先级的处理比较复杂)
        for (int i = 0; i<10; i++) {
            dispatch_async(q, ^{
                NSLog(@"%@",[NSThread currentThread]);
            });
        } 
    }
    

       GCD全局队列:

        

    #pragma mark - 全局队列,苹果为了方便开发者进行多线程开发而保留的全局的队列
    -(void)gcdGlobalQueue
    {
        //全局队列无需创建直接get
       
        
        dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        //同步任务顺序执行
    //    dispatch_sync(q, ^{
    //        NSLog(@"%@",[NSThread currentThread]);
    //    });
        //异步任务会创建多个线程
        for (int i = 0; i < 10; i++) {
            dispatch_async(q, ^{
                NSLog(@"%@",[NSThread currentThread]);
            });
        }
    }
    

        GCD总结

       1>disptach_sync       没有创建线程的欲望,就在当前线程执行

          最主要的目的,阻塞并行队列任务的执行,只有当前的同步任务执行完毕后,后续的任务才能够执行

          应用场景:用户登录!

       2>dispatch_async     有创建线程的欲望,但是创建多少条线程,取决与队列的类型

       GCD的队列

       1>串行队列     类似于跑步,只有一条跑道,最多能够有两条

          如果存在异步任务,就会在新线程中执行异步任务,而同步任务依旧在当前线程中执行

       2>并行队列      类似与赛跑,具体跑道的数量,由系统决定

      一个实际问题的解决

      用户登录操作,登录的过程中可以选择取消登录操作,但是在登录完成之前不能进行其他的操作。

      解决方式是,进行任务嵌套

      

    - (void)demo
    {
        dispatch_queue_t q = dispatch_queue_create("demo", DISPATCH_QUEUE_CONCURRENT);
        
        // 在新线程中工作,将这个登录的过程放在一个异步队列中
        dispatch_async(q, ^{
            // 2
            NSLog(@"%@", [NSThread currentThread]);
            
            __block BOOL userLogon = NO;
            
            // 用户登录,用户输入用户名,密码之后,提交到服务器确认身份
            // 用来阻塞必须要按照顺序执行的任务,将登录的过程放在同步任务中。
            dispatch_sync(q, ^{
                // 2
                NSLog(@"用户网络登陆 %@", [NSThread currentThread]);
                
                [NSThread sleepForTimeInterval:3.0f];
                
                userLogon = NO;
            });
            
            // 身份确认之前,不能做其他事情
            dispatch_async(q, ^{
                // 可能是3,也可能是2
                // 3.0(对的) / 立马执行(不对的)
                NSLog(@"后续处理 %@", [NSThread currentThread]);
                
                if (userLogon) {
                    NSLog(@"welcome");
                } else {
                    NSLog(@"why");
                }
            });
            
            // 队列是先进先出FIFO的,队列中的任务都是串着的
        });
    }
    

      

     

  • 相关阅读:
    INFORMIX体系效能改善第一步
    Ubuntu判袂率不正常的一种复杂治理措施
    ubuntu8.04分区分配方案
    计算机启动更快的十五招
    理顺 JavaScript (13) 对象及 json
    获取指定地址的 JPG 图片 回复 "bangrj" 的问题
    理顺 JavaScript (14) constructor 与 instanceof
    理顺 JavaScript (9) Date 类
    用 API 提取、写入指定网站的 Cookie 回复 "bangrj" 的问题
    理顺 JavaScript (10) Math 类
  • 原文地址:https://www.cnblogs.com/azxfire/p/3762868.html
Copyright © 2011-2022 走看看