GCD同步异步,串行并行总结

本文不做基本概念讲解,只做了一些总结,方便自己日后查看

1.dispatch_get_main_queue

同步提交到主线程,会造成线程阻塞,任务相互等待

异步提交到主队列,在主线程上执行,实质是降低任务优先级,因此会在viewWillAppear,viewDidAppear之后执行,跟runloop有关

2.串行队列

串行队列异步会开启一个新线程,但是只会开一个,如果嵌套如果同步,会造成线程阻塞,嵌套异步不会,嵌套异步任务相当于降低,让串行队列上的任务任务执行完后再执行


(同步嵌套同步会阻塞线程,嵌套异步,会新开一个线程)

(异步嵌套同步会阻塞线程,嵌套异步,不会开启新的线程,会将嵌套任务放入队尾执行)


3.并行队列异步会开启一个新线程,而且还会开多个,如果同步,会按照顺序执行

(异步嵌套异步,会开启新的线程,线程数目由系统决定,嵌套同步,会按顺序执行)

(异步嵌套异步,会开启新的线程,同步嵌套同步,依次按顺序执行)


4.performSelector

先看图,

请问performTest方法会执行吗?

答案是不会

performSelector 在指定线程中立即执行,相当于一个普通的消息发送

performSelector:withObject:afterDelay 其实是在内部创建了一个timer,然后添加到当前线程的runloop中

主线程上能执行,主线程runloop是默认开启的,因此能调度,但是子线程runloop是默认关闭的,因此不能调度事件


解决办法:

这里需要手动将子线程runloop开启,注意需要在 performSelector:withObject:afterDelay  之后开启,如果在之前开启的话,因为runloop没有source,会立即退出,之后再执行肯定就没有用了

你可能感兴趣的:(GCD同步异步,串行并行总结)