iOS开发之GCD串行队列

作者: 程序员_秃头怪 | 来源:发表于2019-03-07 21:20 被阅读19次

iOS开发多线程之GCD
iOS开发之GCD同步任务加强
iOS开发之GCD串行队列
iOS开发之GCD并发队列

实例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”占用了主线程。

推荐文集

* iOS开发之性能优化

* iOS开发之weak底层实现原理

* 2019年iOS面试必备技术点总结

原文作者:集才华美貌于一身的—C姐

相关文章

  • iOS开发多线程之GCD

    iOS开发多线程之GCDiOS开发之GCD同步任务加强iOS开发之GCD串行队列iOS开发之GCD并发队列 GCD...

  • iOS开发之GCD并发队列

    iOS开发多线程之GCDiOS开发之GCD同步任务加强iOS开发之GCD串行队列iOS开发之GCD并发队列 03 ...

  • iOS开发之GCD同步任务加强

    iOS开发多线程之GCDiOS开发之GCD同步任务加强iOS开发之GCD串行队列iOS开发之GCD并发队列 004...

  • iOS开发之GCD串行队列

    iOS开发多线程之GCDiOS开发之GCD同步任务加强iOS开发之GCD串行队列iOS开发之GCD并发队列 实例d...

  • 多线程

    iOS中的几种多线程GCD1、GCD分为任务和队列,任务(同步,异步)队列(串行,并发),同步串行,同步主队列的情...

  • iOS多线程-GCD之同步和异步

    上一篇 iOS多线程-GCD之串行队列和并行队列 在GCD中,同步和异步是由这两个函数来完成的:dispatch_...

  • 关于多线程GCD 串行/并行、同步/异步

    一、GCD串行/并行队列创建 串行队列: 并行队列: 二、GCD串行/并行队列同步/异步执行 执行内容1: 执行结...

  • GCD队列使用

    使用GCD前,先对队列总结一下: 串行和并发 GCD中队列分为两种:串行队列、并发队列。串行队列:任务按在队列里的...

  • GCD串行并发队列

    学习完本篇,您会对以下知识点更加理解: 队列 串行队列 并发队列 GCD全局队列 GCD主队列 创建串行队列 创建...

  • iOS 开发之 GCD 基础

    iOS 开发之 GCD 基础 本文主要为 GCD 的 队列和执行方法等基础总结,目录如下: [TOC] GCD是什...

网友评论

    本文标题:iOS开发之GCD串行队列

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