GCD 多线程的问题,看图片?

这个多线程执行结果是什么?为什么

回答·16
最热
最新
  • 1322 为什么就没人跑一下再回答呢,起码答案是对的,如果不用 performselector 的话,就应该是 1223。 虽然 delay 是 0,但他也要等到主线程执行完所有业务后才会执行这个 selector
  • 输出结果为 132 这个问题是考察线程和 runloop 的知识。 知识点详解: 1. sync 是同步在队列上执行的,不会开启新线程,所以里面的任务会在当前线程同步执行。 2. async 异步派发,任务一定是异步执行的,如果派发到主队列,则在主线程运行,否则会开启一个子线程来执行。 3. perform selector afterDelay 方法会异步执行,是在当前线程上异步执行,线程的任务默认是同步的顺序执行的,而异步的在当前线程执行就会涉及到线程的保活管理,所以必须要求当前线程开启了 runloop, 并且任务异步派发的 mode 和 runloop 运行的 mode 一致。 4. 另外线程和队列配合死锁的条件是在当前线程上派发同步任务到当前线程上。 例如主线上同步派发到主队列上,或子线程同步派发到串行队列上。 回到题目: 1. 首先外层的 sync,以为着里面的代码运行在主线程,往下首先输出 1 2. 接下来又一个 sync 所以里面的 perform 方法调用是发生在主线程,但这个 perform 方法调用之后,里面的 selector 并不会马上执行,会添加到主线程 runloop 上,等当前主线程上的任务做完后再执行。 所以最后会输出一个 2  3. 接下来一个 async ,会开启一个新线程并在该线程调用 perform 方法,且 selector 被异步派发到 runloop 上 ,因为该子线程并没有开启 runloop ,所以这个 selector 最终不会执行 4. 输出 2
  • 🙊楼上的回答是没看清题吗?外面的是 global
  • 里面锁住了  很明显没有理解队列中的任务指的是什么
  • 大概率 1232 因为你的 log2 是同步阻塞执行
  • 招呼语要隔几天换一次,不要干篇一律,要有新颖,及时转换思路和招聘想法
  • 132,这个 2 是 sync 同步的 2。 首先第一个 sync 的 block 已经被提交到当指定(global)队列并开始执行,所以打印 1; 之后第二个 sync 提交 block 到队列,并且要立刻执行,但是通过 performSelector…afterDelay,会创建一个新的 timer 去执行,所以需要等待当前 block 结束然后执行,因为第二个 sync 的 block 都执行完毕了,所以第二 sync 能正常返回。 此时 async 提交 block 到指定(global)队列中,会开启新的线程,通过 performSelector…afterDelay,创建了一个 timer 去执行方法,而新的线程 runloop 是默认不开启的,timer 并不会被执行。async 是立即返回的。所以继续执行打印 3; 至此,第一个 sync 的 block 全部结束。 由于之前还遗留了第二个 sync 的 block 提交的 timer 任务,所以此时继续打印 2; 所以结果是 132。
  • 招呼语要隔几天换一次,不要干篇一律,要有新颖,及时转换思路和招聘想法
  • 只打印 132,里面那个异步全局队列不执行,不知道为什么?
  • 第二个 sync 死锁。