串行 并行 主队列 全局队列
同步 主线程、阻塞 主线程、阻塞 死锁 主线程、阻塞
异步 子线程、只开一条线程 子线程、多条线程 主线程、阻塞 子线程、多条线程
- 串行队列同步执行:综合上面阐述的串行队列的特点 --- 按顺序执行,同步:不会开启新的线程,则串行队列同步执行只是按部就班的one by one执行。
- 串行队列异步执行:虽然队列中存放的是异步执行的任务,但是结合串行队列的特点,前一个任务不执行完毕,队列不会调度,所以串行队列异步执行也是one by one的执行
- 并行队列同步执行:结合上面阐述的并行队列的特点,和同步执行的特点,可以明确的分析出来,虽然并行队列可以不需等待前一个任务执行完毕就可调度下一个任务,但是任务同步执行不会开启新的线程,所以任务也是one by one的执行
- 并行队列异步执行:再上一条中说明了并行队列的特点,而异步执行是任务可以开启新的线程,所以这中组合可以实现任务的并发,再实际开发中也是经常会用到的
一.基本概念
进程: 一个具有一定独立功能的程序关于某个数据集合的一次运行活动。可以理解成一个运行中的应用程序。
线程: 程序执行流的最小单元,线程是进程中的一个实体。
同步: 只能在当前线程按先后顺序依次执行,不开启新线程。
异步: 可以在当前线程开启多个新线程执行,可不按顺序执行。
队列: 装载线程任务的队形结构。
并发: 线程执行可以同时一起进行执行。
串行: 线程执行只能依次逐一先后有序的执行。
注意
不要在主队列中这样调用dispatch_sync,否则会导致主线程卡死。
GCD
dispatch_group
有些时候,我们会有这样子的需求,执行多种操作,当这些操作都完成的时候,再更新UI。如果没有group,你就需要自已去统计哪个操作完成了。但有了Dispatch_group一切将简单化,你把可把多个队列,多个任务都放到同一个group里面,当所有group的任务都完成了,Dispatch可以异步或者同步通知你。
注意
dispatch_group_async等价于dispatch_group_enter() 和 dispatch_group_leave()的组合。
dispatch_group_enter() 必须运行在 dispatch_group_leave() 之前。
dispatch_group_enter() 和 dispatch_group_leave() 需要成对出现的
dispatch_group_notify
向group追加任务队列,当所有的任务都完成后,它会异步通知你。
dispatch_barrier_async
这样说这个函数吧,当使用dispstch_async时候,是无法保证每个任务的执行顺序的。而dispatch_barrier_async则可以使执行某些任务之后,再去执行另外一些任务。
先执行
dispatch_barrier_async
之前添加的block,再执行
dispatch_barrier_async
。
dispatch_apply
如果你需要重复执行同一个任务,
dispatch_apply
是你最好的选择。
dispatch_apply
是以同步的方式把任务追加到队列当中,所以我们一般会在
dispatch_async
函数中异步执行该函数。
dispatch_suspend & dispatch_resume
dispatch_suspend挂起指定的队列
dispatch_supend(queue);
dispatch_resume恢复指定队列
dispatch_resume(queue);
线程挂起对已执行的任务没有影响,挂起后,还未执行的任务停止执行,待恢复后,这些任务继续执行