美文网首页iOS面试
iOS,GCD之同步,异步,串行,并行队列,主队列总结

iOS,GCD之同步,异步,串行,并行队列,主队列总结

作者: 随风抒 | 来源:发表于2019-01-31 15:21 被阅读0次

原创纯文字的,但绝对是能解释你所有疑问的!(有一点基础的来看吧),鉴于网上很多总结都是现象,很少解释出根本原因,即使说了的原因,说出来的原因有的不太对,所以发表这篇文章.

同步执行新任务:中断当前任务,立即执行新任务.

异步执行新任务:不中断当前任务,等待执行新任务.


串行队列:任务逐一执行,先进先出.

并行队列:任务并发执行,但也遵循着先进先出.

主队列:系统创建的一个串行队列而已,网上其他文章说的很特别,甚至单独搞个表格来说明它的不同,有点更加无法让人深入理解.

是否创建新线程?

首先要搞清为什么会创建新线程:同一线程,同一时间,只能执行一个任务.所以只要是想在同一时间执行多个任务,就需要创建新线程.(单线程也能执行多任务,但是是伪执行,按上述理解就行)

所以:是否创建新线程不能由是否是异步决定,但绝不会违反上述原则,理解上述原则,则能知道什么时候会创建新线程,请看具体剖析


剖析开始!


首先得记住:

创建队列,同步,异步也好,这些代码操作本身就属于某个队列的某个任务中的部分.为了方便理解,你可以将以下这些操作当成是  : 主队列+任务A


主队列+任务A中  创建串行队列+同步新任务B,C,D:

1.新任务会中断A任务立即执行,因为是同步

2.新任务BCD会一个一个有序的执行.因为是同步而不是因为串行.(不能理解就仔细看上一条1)

3.不会创建新线程.因为这种情况只会在同一时间执行一个任务.完全没有必要创建新线程

4.感兴趣的可以试试,在同步的B任务中再同步个E任务到这个串行队列.会怎么样? 咳咳.会死锁.看懂的自然就理解了.


主队列+任务A中 创建串行队列+异步新任务B,C,D:

1.新任务不会中断A任务,而是等待A结束后再执行,因为是异步

2.新任务BCD会一个一个有序的执行.因为是串行.

3.会创建新线程吗? 

会:

因为主队列的线程还可能要执行其他的任务(虽然是A结束了,但不代表主队列后面没有其他任务),这个新串行队列的任务自然需要新的线程了

但是即使你异步100个任务也只会创建一条线程:

新队列是串行队列,所以只需一条线程,看懂的应该明白主队列+异步为什么不会创建新线程了


主队列+任务A中 创建并行队列+同步新任务B,C,D:

1.新任务会中断A任务立即执行,因为是同步

2.新任务BCD会一个一个有序的执行,但是是因为同步的原因.

3.会创建新线程吗?不想写了, 肯定是不会啊,你给他一个需要创建新线程的理由.


主队列+任务A中 创建并行队列+异步新任务B,C,D:

1.新任务不会中断A任务,而是等待执行,因为是异步

2.新任务BCD会并发执行,因为是并行+异步.(仔细理解一下吧,缺一不可,并行队列中有多个任务的时候才会发生并发,之前的情况,并行队列中只会有一个任务,)

3.会创建新线程.而且是多个,但不会是无限制的创建(保护机制,操作系统机制)


主队列+任务A中 同步新任务B,C,D:

1,新任务会中断A任务立即执行,因为是同步

2,新任务BCD会等待A执行完毕后再执行,因为是主队列是串行

3.1和2冲突了呢.看到了吗?这就是死锁


主队列+任务A中 异步新任务B,C,D:

1.新任务不会中断A任务,而是等待执行,因为是异步

2.新任务BCD会一个一个有序的执行.因为主队列是串行.

3.会创建线程吗?没有创建的理由

4.主队列在多线程层面毫无特别之处.这和 下面某些情况是一模一样的


以上理解了 来点复杂的吧

主队列+任务A中 创建串行队列+同步新任务B,C  然后B中同步任务D,E到创建队列.(会死锁)

主队列+任务A中 创建串行队列+同步新任务B,C  然后B中异步任务D,E到创建队列.

主队列+任务A中 创建串行队列+异步新任务B,C  然后B中同步任务D,E到创建队列.(会死锁)

主队列+任务A中 创建串行队列+异步新任务B,C  然后B中异步任务D,E到创建队列.

主队列+任务A中 创建并行队列+同步新任务B,C  然后B中异步任务D,E到创建队列.

主队列+任务A中 创建并行队列+同步新任务B,C  然后B中同步任务D,E到创建队列.

主队列+任务A中 创建并行队列+异步新任务B,C  然后B中异步任务D,E到创建队列.

主队列+任务A中 创建并行队列+异步新任务B,C  然后B中同步任务D,E到创建队列.

相关文章

  • 关于多线程GCD 串行/并行、同步/异步

    一、GCD串行/并行队列创建 串行队列: 并行队列: 二、GCD串行/并行队列同步/异步执行 执行内容1: 执行结...

  • IOS多线程总结

    目录 简述 NSThread GCD操作与队列异步操作并行队列同步操作并行队列同步操作串行队列异步操作串行队列队列...

  • GCD基础总结一

    上代码~ 同步串行队列 同步并行队列 异步串行队列 异步并行队列 主队列同步 会卡住 主队列异步

  • GCD

    1、同步串行队列 2、同步并行队列 3、异步串行队列 4、异步并行队列 5、死锁 主线程中创建同步串行队列 主线程...

  • 多线程

    iOS中的几种多线程GCD1、GCD分为任务和队列,任务(同步,异步)队列(串行,并发),同步串行,同步主队列的情...

  • 多线程

    1、同步、异步、串行、并行、全局队列、主队列2、Thread、NSOperation、GCD3、锁

  • iOS多线程-GCD之同步和异步

    上一篇 iOS多线程-GCD之串行队列和并行队列 在GCD中,同步和异步是由这两个函数来完成的:dispatch_...

  • 【iOS出租屋进阶】之多线程GCD详解

    线程、任务和队列的概念 异步、同步 & 并行、串行的特点 组合 |并行队列|串行队列 |主队列----|----|...

  • iOS GCD随记(一)任务/队列组合

    1.同步执行+串行队列2.同步执行+并行队列3.异步执行+串行队列4.异步执行+并行队列5.同步执行+主队列6.异...

  • GCD 细细的读

    目录 前言 为什么选择GCD? 串行队列、并行队列、同步、异步 线程死锁解析 DispatchQueue的使用 D...

网友评论

    本文标题:iOS,GCD之同步,异步,串行,并行队列,主队列总结

    本文链接:https://www.haomeiwen.com/subject/jnyksqtx.html