原创纯文字的,但绝对是能解释你所有疑问的!(有一点基础的来看吧),鉴于网上很多总结都是现象,很少解释出根本原因,即使说了的原因,说出来的原因有的不太对,所以发表这篇文章.
同步执行新任务:中断当前任务,立即执行新任务.
异步执行新任务:不中断当前任务,等待执行新任务.
串行队列:任务逐一执行,先进先出.
并行队列:任务并发执行,但也遵循着先进先出.
主队列:系统创建的一个串行队列而已,网上其他文章说的很特别,甚至单独搞个表格来说明它的不同,有点更加无法让人深入理解.
是否创建新线程?
首先要搞清为什么会创建新线程:同一线程,同一时间,只能执行一个任务.所以只要是想在同一时间执行多个任务,就需要创建新线程.(单线程也能执行多任务,但是是伪执行,按上述理解就行)
所以:是否创建新线程不能由是否是异步决定,但绝不会违反上述原则,理解上述原则,则能知道什么时候会创建新线程,请看具体剖析
剖析开始!
首先得记住:
创建队列,同步,异步也好,这些代码操作本身就属于某个队列的某个任务中的部分.为了方便理解,你可以将以下这些操作当成是 : 主队列+任务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到创建队列.
网友评论