一、各种队列的执行效果总结 1.我们现在去总结一下,各种队列的执行效果,刚刚我们学过几种队列,几种执行?四种队列,两种执行, 1)四种队列分别是:串行队列,并行队列,主队列,全局队列, 2)两种执行分别是:同步执行,异步执行, 好,我们看它们搭配起来,会有什么效果啊,我们看,这里边,是不是少一个,全局并行队列,全局并行队列,其实,它跟并行队列的执行效果是一样的,所以就没有必要再去重新开一列了,那我们来看啊, 1)同步执行:它的特点,是不开启新线程,不管是哪种方式,不开线程、不开线程、到主队列这儿呢,会死锁,也是不开线程吧,所以,同步执行都不会开线程, 2)异步执行:它的特点,是开启新线程,不管是哪种方式,开线程、开线程、到主队列这儿呢,不开线程,因为主队列比较特殊吧,一看主队列,就是在主线程上执行的,我们认为,只要是异步执行,不考虑主队列的话,都会开线程, 我们再来看: 1)同步执行——并行队列:执行的特点是,串行执行任务,就是顺序执行任务,同步,首先,不开线程,不开线程,即使你是并行队列,我也没办法同时执行多个任务,因为只有一个线程,所以,它依然是串行执行任务, 2)同步执行——串行队列:执行的特点是,串行执行任务,一看串行队列,肯定是顺序执行的啊, 3)异步执行——串行队列:执行的特点是,串行执行任务,串行队列的话,是不是都是顺序执行的啊,开启一个线程,顺序执行任务, 4)异步执行——并行队列:执行的特点是,并行执行任务,开启新线程,无序执行,同时执行, 5)同步执行——主队列:执行的特点是,会死锁,注意是在主线程上的时候,会遇到死锁,在子线程上的时候,不会死锁, 6)异步执行——主队列:执行的特点是,不会开线程,在主队列上,不管是什么任务,都会串行执行任务,因为只有一个线程, 这是上午我们看到,各个队列和两种执行方式的组合,记的时候怎么记,这个表只是帮着你理解而已,你也不要按照这个表来记,是不是按照这个名字来记, 1)并行同步:不开线程,顺序执行 2)并行异步:开线程,无序执行 3)串行同步:不开线程,顺序执行 4)串行异步:开线程,顺序执行 5)主队列同步:死锁 6)主队列异步:不开线程,顺序执行 按这个名字去想,想不明白你再画图,有一个队列,里边有任务,这些任务是在哪个线程上执行的,去画图,建议你去画图,去消化一下内容,是最好的方式,主队列里边,有一个特殊的地方,就是会死锁, 二、复习一下上午学的内容 1.消息循环 1)主线程的消息循环默认开启,子线程的消息循环默认不开启, 2.消息循环的目的 1)保证程序不退出 2)负责处理输入事件 3.消息循环里边,两个核心点 1)输入事件 2)消息循环的模式 我们在设置输入事件的时候,必须指定消息循环的模式,当前消息循环运行在一种模式下,这两种模式必须匹配,这个输入事件,才会执行, // 输入事件的模式必须跟当前消息循环的模式匹配,输入事件才会执行 4.子线程消息循环 run 子线程的消息循环,怎么去开启,获取当前消息循环,调用run方法,调用NSRunLoop的run方法, 子线程的消息循环,简单了解一下就OK了,主要是上边的一些内容,子线程的消息循环,只是一个演示, 5.GCD // 队列:串行队列 并行队列 全局(并行)队列 主队列 // 任务:同步任务 异步任务 // 执行:同步执行 异步执行 任务是这样吗,任务有什么任务,任务没区分是吧,任务就是一个block,我们把任务放到队列里,做的区分啊,这是执行,有同步执行,异步执行, 6.各种组合 // 6.1 串行队列 // 同步执行:不开线程,顺序执行 // 异步执行:开一个线程,顺序执行 // 6.2 并行队列 // 同步执行:不开线程,顺序执行 // 异步执行:开多个线程,无序执行 再往后是,全局队列,全局队列就是并行队列,所以它的特点是一样的, // 6.3 主队列 // 同步执行:在主线程上执行的话会死锁 // 异步执行:主线程,顺序执行 好,这是上午我们看的几种组合, 三、Barrier阻塞 1.下边我们来看一个新的内容,Barrier,这个单词翻译过来的话,是阻塞的意思,那它是干什么的,我们一会儿通过一个练习,来解释,首先,看一句话啊,它是干什么的,主要用于在多个异步操作完成之后,统一对非线程安全的对象进行更新,这句话能看懂吗,再分析一下啊, 多个异步操作,首先有多个操作,并且这多个操作,是异步执行的,有多个任务啊,这些任务是异步执行的,当这些异步操作执行完成之后,等它们都执行完成之后,统一对非线程安全的对象进行更新,下面,我们把这句话拆解成一个练习,假设我们要从网络上下载很多很多张图片,并且,等这些图片都下载完成之后,把它们统一放到非线程安全的数组中, 我要模拟从网络上下载很多很多张图片,等这些图片都下载完成,如果不等它们都下载完成,下载完一张,我就把它放到一个非线程安全的数组中,这个时候,会出现什么问题,下边,我们先演示第一步,会出什么问题,