iOS GCD的基本使用

一:什么是GCD

GCD的全程是:Grand Central Dispatch, 直白的用汉语翻译就是:厉害的中枢调度器.

GCD 是iOS 的多线程技术的实现方案,但是它并不是多线程技术,它是“并发解决技术”,是苹果公司研发的,会自动管理线程(这一段定义有点拗口,简单了解就行)

GCD会自动管理线程的生命周期(创建线程、调度任务、销毁线程)程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码

二:CGD的两个核心概念

1.任务: 执行了什么操作(任务使用block来定义)

2.对列:(是一种数据结构,先进先出)用来存放任务

简而言之,就是 创建任务--创建对列-->把任务放到对列里.

执行任务有两种方式:同步执行(sync)和异步执行(async)

对列有两种类型:串行对列,并行对列

(代码里还有主队列:主队列 dispatch_get_main_queue(),但是它是一种特殊的串行对列)

(还有全局并发对列 dispatch_get_global_queue(),它也是一种并行对列)​​​​​​​

(注意:并行对列并不是说有多个对列并行,不管串行对列还是并行对列,都只有一个对列,对列里放的任务是串行的,叫串行对列,对列里放的任务是并行的,叫并行对列)

所以理论上任务和对列有4种组合方案:

1.串行对列里添加同步任务;

2.串行对列里添加异步任务;

3.并行对列里添加同步任务; (并行对列里具备了多个任务一起执行的能力,但是由于加入的任务是同步的,所以无法多个任务一同执行,得排队执行)

4.并行对列里添加异步任务.

另外还有一个主对列 dispatch_get_main_queue()

主对列里添加了同步任务

主队列里添加了异步任务

几种组合的区别如下图:

以上图片可以总结为:

同步任务+并发对列:按顺序执行任务,不会开启新线程

异步任务+并发对列:不一定按顺序执行任务,会开启新线程(有几个任务就开启几个线程)

同步任务+串行对列:按顺序执行任务,不会开启新线程

异步任务+串行对列:按顺序执行任务,会开启一个新线程(不管有多少个任务,只有开一个新线程)

记忆点:只要是同步任务,都不会开启新线程;

             异步任务会开启新线程,N个异步任务放入到串行对列,只开一个线程,N个异步任务放入并         行对列,会开N个新线程

1.同步任务+并行对列:

//1.同步任务+并行对列
- (void)dispathDemo1
{
    dispatch_queue_t queue = dispatch_queue_create(@"同步任务+并行对列", DISPATCH_QUEUE_CONCURRENT);
    
    //在当前线程中执行任务,不会开启新线程,执行完一个任务,再执行下一个任务。
    NSLog(@"同步任务开始,当前线程==%@",[NSThread currentThread]);
    [NSThread sleepForTimeInterval:2]; // 模拟耗时操作
    
    //for循环,创建5个任务,放入queue种
    for (int i = 0; i < 5; i ++)
    {
        //同步函数
        dispatch_sync(queue, ^{
           
            if (i == 1) {
                [NSThread sleepForTimeInterval:10];
            }
            
            NSLog(@"当前打印值==%d,线程==%@",i,[NSThread currentThread]);
            
        });
    }

    NSLog(@"同步任务结束,当前线程==%@",[NSThread currentThread]);
}

输出的顺序为:

同步任务开始,当前线程==<_NSMainThread: 0x600001704000>{number = 1, name = main}
当前打印值==0,线程==<_NSMainThread: 0x600001704000>{number = 1, name = main}
当前打印值==1,线程==<_NSMainThread: 0x600001704000>{number = 1, name = main}
当前打印值==2,线程==<_NSMainThread: 0x600001704000>{number = 1, name = main}
当前打印值==3,线程==<_NSMainThread: 0x600001704000>{number = 1, name = main}
当前打印值==4,线程==<_NSMainThread: 0x600001704000>{number = 1, name = main}
同步任务结束,当前线程==<_NSMainThread: 0x600001704000>{number = 1, name = main}

可以看到:

所有任务都是在当前线程(主线程)中执行的,没有开启新的线程(同步执行不具备开启新线程的能力)
所有任务都在打印的 同步任务开始和syncConcurrent begin—syncConcurrent end之间执行的(同步任务需要等待队列的任务执行结束)
任务按顺序执行的。按顺序执行的原因:虽然并发队列可以开启多个线程,并且同时执行多个任务。但是因为本身不能创建新线程,只有当前线程这一个线程(同步任务不具备开启新线程的能力),所以也就不存在并发。而且当前线程只有等待当前队列中正在执行的任务执行完毕之后,才能继续接着执行下面的操作(同步任务需要等待队列的任务执行结束)。所以任务只能一个接一个按顺序执行,不能同时被执行。

写累了,不想写了,具体可以参考文章:iOS 多线程GCD_gcd多线程-****博客

https://blog.****.net/fengyuyxz/article/details/114835909?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogOpenSearchComplete%7ERate-2-114835909-blog-138373634.235%5Ev43%5Epc_blog_bottom_relevance_base1&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogOpenSearchComplete%7ERate-2-114835909-blog-138373634.235%5Ev43%5Epc_blog_bottom_relevance_base1&utm_relevant_index=3​​​​​​​

上一篇:es kibana .logstash离线集群安装-es离线集群安装


下一篇:AIGC技术的学习 系列二