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

小驴拉磨之iOS进阶-多线程(5)—— GCD 串行队列_第1张图片
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] {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] {number = 1, name = main}
2017-11-16 14:00:15.840598+0800 GCDDome-串行队列[4307:2557343] {number = 1, name = main}
2017-11-16 14:00:15.840621+0800 GCDDome-串行队列[4307:2557343] {number = 1, name = main}
2017-11-16 14:00:15.840641+0800 GCDDome-串行队列[4307:2557343] {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] {number = 3, name = (null)}
2017-11-16 14:06:45.128348+0800 GCDDome-串行队列[4312:2560151] {number = 3, name = (null)}
2017-11-16 14:06:45.128392+0800 GCDDome-串行队列[4312:2560151] {number = 3, name = (null)}
2017-11-16 14:06:45.128418+0800 GCDDome-串行队列[4312:2560151] {number = 3, name = (null)}
2017-11-16 14:06:45.129258+0800 GCDDome-串行队列[4312:2560151] {number = 3, name = (null)}
2017-11-16 14:06:45.129293+0800 GCDDome-串行队列[4312:2560151] {number = 3, name = (null)}

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

你可能感兴趣的:(小驴拉磨之iOS进阶-多线程(5)—— GCD 串行队列)