iOS多线程同步异步、串行并发的我的剖析(GCD)

先来讲一个队列和任务:程序员

队列分为串行和并行多线程

任务的执行分为同步和异步并发

这两两组合就成为了串行队列同步执行,串行队列异步执行,并行队列同步执行,并行队列异步执行异步

而异步是多线程的代名词,异步在实际引用中会开启新的线程,执行耗时操做。spa

 

那咱们先来知道一个很是重要的事情:线程

-------  队列只是负责任务的调度,而不负责任务的执行   ---------队列

------- 任务是在线程中执行的  ---------开发

 

队列和任务的特色:get

队列的特色:先进先出,排在前面的任务最早执行,同步

串行队列:任务按照顺序被调度,前一个任务不执行完毕,队列不会调度

并行队列:只要有空闲的线程,队列就会调度当前任务,交给线程去执行,不须要考虑前面是都有任务在执行,只要有线程能够利用,队列就会调度任务。

主队列:专门用来在主线程调度任务的队列,因此主队列的任务都要在主线程来执行,主队列会随着程序的启动一块儿建立,咱们只需get便可

全局队列:是系统为了方便程序员开发提供的,其工做表现与并发队列一致,那么全局队列跟并发队列的区别是什么呢?

1.全局队列:不管ARC仍是MRC都不须要考录释放,由于系统提供的咱们只须要get就能够了

2.并发队列:再MRC下,并发队列建立出来后,须要手动释放dispatch_release()

同步执行:不会开启新的线程,任务按顺序执行

异步执行:会开启新的线程,任务能够并发的执行

 

那么有这么几种组合

  1. 串行队列同步执行:综合上面阐述的串行队列的特色 --- 按顺序执行,同步:不会开启新的线程,则串行队列同步执行只是循序渐进的one by one执行。
  2. 串行队列异步执行:虽然队列中存放的是异步执行的任务,可是结合串行队列的特色,前一个任务不执行完毕,队列不会调度,因此串行队列异步执行也是one by one的执行
  1. 并行队列同步执行:结合上面阐述的并行队列的特色,和同步执行的特色,能够明确的分析出来,虽然并行队列能够不需等待前一个任务执行完毕就可调度下一个任务,可是任务同步执行不会开启新的线程,因此任务也是one by one的执行
  2. 并行队列异步执行:再上一条中说明了并行队列的特色,而异步执行是任务能够开启新的线程,因此这中组合能够实现任务的并发,再实际开发中也是常常会用到的

 

GCD实现原理:

GCD有一个底层线程池,这个池中存放的是一个个的线程。之因此称为“池”,很容易理解出这个“池”中的线程是能够重用的,当一段时间后这个线程没有被调用胡话,这个线程就会被销毁。注意:开多少条线程是由底层线程池决、、、、、定的(线程建议控制再3~5条),池是系统自动来维护,不须要咱们程序员来维护(看到这句话是否是很开心?)

而咱们程序员须要关心的是什么呢?咱们只关心的是向队列中添加任务,队列调度便可。

  • 若是队列中存放的是同步任务,则任务出队后,底层线程池中会提供一条线程供这个任务执行,任务执行完毕后这条线程再回到线程池。这样队列中的任务反复调度,由于是同步的,因此当咱们用currentThread打印的时候,就是同一条线程。
  • 若是队列中存放的是异步的任务,(注意异步能够开线程),当任务出队后,底层线程池会提供一个线程供任务执行,由于是异步执行,队列中的任务不需等待当前任务执行完毕就能够调度下一个任务,这时底层线程池中会再次提供一个线程供第二个任务执行,执行完毕后再回到底层线程池中。
  • 这样就对线程完成一个复用,而不须要每个任务执行都开启新的线程,也就从而节约的系统的开销,提升了效率。在iOS7.0的时候,使用GCD系统一般只能开5~8条线程,iOS8.0之后,系统能够开启不少条线程,可是实在开发应用中,建议开启线程条数:3~5条最为合理。

            ~~~未完待续~~~

相关文章
相关标签/搜索