美文网首页
小驴拉磨之iOS进阶-多线程(5)—— GCD 串行队列

小驴拉磨之iOS进阶-多线程(5)—— GCD 串行队列

作者: 小驴拉磨 | 来源:发表于2017-11-16 14:10 被阅读19次
    11111.jpg

    在之前的文章中也介绍到了串行以及并行,这次是关于串行队列的详细介绍

    串行队列

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

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

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

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

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

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

    2017-11-16 13:37:52.851865+0800 GCDDome-串行队列[4297:2548551] <NSThread: 0x1c406a8c0>{number = 1, name = main}

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

    //MARK:串行队列,同步任务
    -(void) GCDSerialQueuesTwo
    {
        //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]);
        
        });
        }
    }
    
    • 运行结果

    2017-11-16 14:00:15.840543+0800 GCDDome-串行队列[4307:2557343] <NSThread: 0x1c0077b40>{number = 1, name = main}
    2017-11-16 14:00:15.840598+0800 GCDDome-串行队列[4307:2557343] <NSThread: 0x1c0077b40>{number = 1, name = main}
    2017-11-16 14:00:15.840621+0800 GCDDome-串行队列[4307:2557343] <NSThread: 0x1c0077b40>{number = 1, name = main}
    2017-11-16 14:00:15.840641+0800 GCDDome-串行队列[4307:2557343] <NSThread: 0x1c0077b40>{number = 1, name = main}
    2017-11-16 14:00:15.840661+0800 GCDDome-串行队列

    • 总结
    不会开启线程
    顺序执行,只有1个线程,任务是按照队列顺序来的。所以是顺序执行
    

    串行队列,异步任务

    //MARK:串行队列,异步任务
    -(void)GCDSerialQueuesThree
    {
        //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 我在主线程");
    }
    
    • 运行结果

    2017-11-16 14:06:45.127890+0800 GCDDome-串行队列[4312:2560061] come here 我在主线程
    2017-11-16 14:06:45.127958+0800 GCDDome-串行队列[4312:2560151] <NSThread: 0x1c4665280>{number = 3, name = (null)}
    2017-11-16 14:06:45.128348+0800 GCDDome-串行队列[4312:2560151] <NSThread: 0x1c4665280>{number = 3, name = (null)}
    2017-11-16 14:06:45.128392+0800 GCDDome-串行队列[4312:2560151] <NSThread: 0x1c4665280>{number = 3, name = (null)}
    2017-11-16 14:06:45.128418+0800 GCDDome-串行队列[4312:2560151] <NSThread: 0x1c4665280>{number = 3, name = (null)}
    2017-11-16 14:06:45.129258+0800 GCDDome-串行队列[4312:2560151] <NSThread: 0x1c4665280>{number = 3, name = (null)}
    2017-11-16 14:06:45.129293+0800 GCDDome-串行队列[4312:2560151] <NSThread: 0x1c4665280>{number = 3, name = (null)}

    • 总结
    只会开一条线程
    顺序执行,只有1个线程,任务是按照队列顺序来的。所以是顺序执行
    

    相关文章

      网友评论

          本文标题:小驴拉磨之iOS进阶-多线程(5)—— GCD 串行队列

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