iOS 开发每天分享优质文章iOS学习

05 GCD 串行队列

2017-09-04  本文已影响464人  CC老师_HelloCoder

实例demo 003--GCD演示

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

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

画图解释

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

线程池的线程数,是由系统决定。你的任务加入队列后,是否能被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”占用了主线程。

上一篇下一篇

猜你喜欢

热点阅读