05 GCD 串行队列

作者: CC老师_HelloCoder | 来源:发表于2017-09-04 20:02 被阅读464次

    实例demo 003--GCD演示

    • GCD核心概念:将任务添加对象,指定任务执行的方法

    • 任务
      使用block封装
      block就是一个提前准备好的代码块,在需要的时候执行

    • 队列(负责调度任务)
      串行:一个接一个的调度任务
      并发:可以同时调度多个任务

    • 任务执行函数(任务都需要在线程中执行!!)
      同步执行:当前指令不完成,不会执行下一个指令
      异步执行:当前指令不完成,不会等待,继续执行下一条指令

    串行队列,同步(单)任务

    //MARK:串行队列,同步任务
    -(void)gcdDemo1
    {
        //1.队列-串行
        /*
        参数1:队列名称
        参数2:队列属性 DISPATCH_QUEUE_SERIAL 串行,等价于NULL
        */
        dispatch_queue_t  q = dispatch_queue_create("CC_queue",NULL);
        
        //2.同步执行任务
        dispatch_sync(q,^{
            
            NSLog(@"%@",[NSThread currentThread]);
        
        });
    }
    
    

    画图解释

    • 同步和异步,决定2件事。从队列里拿任务,从线程池拿线程;
    • 同步任务是不会去线程池拿线程的。==能理解的打个“1”==
    • 串行队列:决定是否去拿任务,串行队列必须一个一个执行,即便是多线程,也不能给你任务;
    • 并发队列:会拿出多个任务,同步任务的话,你有任务,没有线程。

    总结
    怎么拿任务,看是串行、并行
    怎么拿队列,看是同步、异步

    线程池的线程数,是由系统决定。你的任务加入队列后,是否能被CPU调度,看CPU

    串行队列,同步(多)任务

    //MARK:串行队列,同步任务
    -(void)gcdDemo1
    {
        //1.队列-串行
        /*
        参数1:队列名称
        参数2:队列属性 DISPATCH_QUEUE_SERIAL 串行,等价于NULL
        */
        dispatch_queue_t  q = dispatch_queue_create("CC_queue",NULL);
        
        //2.同步执行任务
        for(int i = 0;i < 10;i++)
        {
        dispatch_sync(q,^{
            
            NSLog(@"%@",[NSThread currentThread]);
        
        });
        }
    }
    
    

    问题
    1.开启线程吗?
    不会开启线程
    2.顺序执行?
    顺序执行,只有1个线程,任务是按照队列顺序来的。所以是顺序执行

    串行队列,异步任务

    //MARK:串行队列,异步任务
    -(void)gcdDemo2
    {
        //1.队列-串行
        /*
        参数1:队列名称
        参数2:队列属性 DISPATCH_QUEUE_SERIAL 串行,等价于NULL
        */
        dispatch_queue_t  q = dispatch_queue_create("CC_queue",NULL);
        
        //2.异步执行任务 async
        for(int i = 0;i < 10;i++)
        {
        dispatch_async(q,^{
            
            NSLog(@"%@",[NSThread currentThread]);
        
        });
        }
        
        //它在主线程
        NSLog(@"come here");
    }
    
    

    问题
    1.开启几条线程吗?
    开启1条线程
    2.顺序执行?
    顺序执行,只有1个线程,任务是按照队列顺序来的。所以是顺序执行

    只要是异步就可以获取多个线程,但是串行队列,任务没有完成,不能拿任务。所以只会获取1个线程,因为加另外一个线程,没有任务。

    3.come here什么时候执行?
    答案:一上来就执行!有可能有交替的,插在中间。子线程和主线程谁先执行任务,是不能确定的。因为这是CPU调度的。come Here在主线程

    4.在循环主线程里加入一句打印i

    for(int i = 0; i < 10; i++)
    {
        NSLog(@"%d---------",i);
        dispatch_async(q,^{
         NSLog(@"%@,%@",[NSThread currentThread],i);
        });
    }
    NSLog(@"come here");
    
    

    答案:
    会先打印“i”,再执行一次异步线程任务,接着在打印“i”,在执行异步线程,交替执行。它们分属2条线程,主线程和异步线程。但是"come here"必须是i=9,才会执行。因为打印“i”占用了主线程。

    相关文章

      网友评论

        本文标题:05 GCD 串行队列

        本文链接:https://www.haomeiwen.com/subject/wtvhrxtx.html