面试问题 线程、队列

  1. 串行队列+同步任务:不会开启新的线程,任务逐步完成。
  2. 并发队列+同步任务:不会开启新的线程,任务逐步完成。
  3. 串行队列+异步任务:开启新的线程,任务逐步完成。
  4. 并发队列+异步任务:开启新的线程,任务同步完成。

队列和任务

  1. 并发跟串行属于队列
  2. 同步跟异步属于执行任务

 同步异步的区别

  1. 同步会卡死线程,一个线程要等待上一个线程执行完之后才能执行当前的线程
  2. 异步同时去做两件或者多件事。

队列的特点

  1. 先进先出,排在前面的任务最先执行,
  2. 串行队列:任务按照顺序被调度,前一个任务不执行完毕,队列不会调度
  3. 并行队列:只要有空闲的线程,队列就会调度当前任务,交给线程去执行,不需要考虑前面是都有任务在执行,只要有线程可以利用,队列就会调度任务。
  4. 主队列:专门用来在主线程调度任务的队列,所以主队列的任务都要在主线程来执行,主队列会随着程序的启动一起创建,我们只需get即可
  5. 全局队列:是系统为了方便程序员开发提供的,其工作表现与并发队列一致,那么全局队列跟并发队列的区别是什么呢?
  • 全局队列:无论ARC还是MRC都不需要考录释放,因为系统提供的我们只需要get就可以了
  • 并发队列:再MRC下,并发队列创建出来后,需要手动释放dispatch_release()
  • 同步执行:不会开启新的线程,任务按顺序执行
  • 异步执行:会开启新的线程,任务可以并发的执行

几种组合

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

GCD实现原理

  • GCD有一个底层线程池,这个池中存放的是一个个的线程。之所以称为“池”,很容易理解出这个“池”中的线程是可以重用的,当一段时间后这个线程没有被调用的话,这个线程就会被销毁。注意:开多少条线程是由底层线程池决定的(线程建议控制再3~5条),池是系统自动来维护,不需要我们程序员来维护
  • 而我们程序员需要关心的是什么呢?我们只关心的是向队列中添加任务,队列调度即可。
  • 如果队列中存放的是同步任务,则任务出队后,底层线程池中会提供一条线程供这个任务执行,任务执行完毕后这条线程再回到线程池。这样队列中的任务反复调度,因为是同步的,所以当我们用currentThread打印的时候,就是同一条线程。
  • 如果队列中存放的是异步的任务,(注意异步可以开线程),当任务出队后,底层线程池会提供一个线程供任务执行,因为是异步执行,队列中的任务不需等待当前任务执行完毕就可以调度下一个任务,这时底层线程池中会再次提供一个线程供第二个任务执行,执行完毕后再回到底层线程池中。
  • 这样就对线程完成一个复用,而不需要每一个任务执行都开启新的线程,也就从而节约的系统的开销,提高了效率。在iOS7.0的时候,使用GCD系统通常只能开5~8条线程,iOS8.0以后,系统可以开启很多条线程,但是实在开发应用中,建议开启线程条数:3~5条最为合理。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值