DispatchQueue
DispatchQueue 简介
DispatchQueue
位于系统的Dispatch
库中。 也称为Grand Central Dispatch (GCD)
,包含语言功能、运行时库和系统增强功能,为 macOS、iOS、watchOS 和 tvOS 中的多核
硬件上的并发
代码执行支持提供系统、全面的改进。- 继承关系:
DispatchQueue
->DispatchObject
->OS_object
->NSObject
。 DispatchQueue
是一个在应用程序的主线程
或后台线程
上管理任务的串行
或并行
的对象。DispatchQueue
是一个FIFO
队列,您的应用程序可以以块对象 Block
的形式向其提交任务
。以串行
或并行
方式执行任务
。- 提交到
DispatchQueue
的任务
在系统管理的线程池
上执行。使用 GCD,您不再直接与线程交互, 除了代表应用程序主线程
的DispatchQueue
外,系统不保证它使用哪个线程来执行任务。
- 提交到
GCD中涉及到了四个专业的名词,
串行队列
并发队列
同步执行
异步执行
Serial Queue
- 串行队列, 一次只执行一项任务。串行队列通常用于同步对特定值或资源的访问,以防止发生数据竞争。
Concurrent Queue
- 并发队列可以同时执行多个任务。任务按照它们添加的顺序开始,但可以以不同的顺序完成,因为它们可以并行执行。任务将在由调度队列管理的不同线程上运行。同时运行的任务数量是可变的,取决于系统条件。
sync execute
- 同步执行任务,提交一个任务在当前队列上执行,并在该任务执行完成后返回,阻塞。
async execute
- 异步执行任务,提交一个任务在当前队列上执行,并立即返回,无需等待,非阻塞。
Serial Queue 串行队列
- 串行调度队列一次只执行一项任务。串行队列通常用于同步对特定值或资源的访问,以防止发生数据竞争。
串行队列-创建
创建串行队列
1
2// 只传入label默认创建的就是一个串行队列
let serialQueue = DispatchQueue(label: "com.serial.queue")系统还为我们提供了一个特殊的串行队列,也叫
主队列
, 它在主线程在执行任务。1
let mainQueue = DispatchQueue.main
串行队列-执行
同步执行
1 | // 只传入label默认创建的就是一个串行队列 |
异步执行
1 | let serialQueue = DispatchQueue(label: "com.serial.queue") |
结论
- 在串行队列中,任务是一个接一个的执行,下一个任务需要等待上一个任务结束才能执行。
思考:
在串行队列中,任务都是一个接一个的执行的,那么、同步执行和异步执行有什么别呢?
我们将上面的代码连带所在的线程一起打印出来看一下:
1 | let serialQueue = DispatchQueue(label: "com.serial.queue") |
重点
- 在串行队列中,使用同步执行,任务会在
当前线程
中执行。注意:并不一定就是主线程哦, 而是在创建该串行队列时的所在线程。 - 在串行队列中,使用异步执行,任务会另外开启
一条
新的线程
来执行, 不会阻塞当前线程,任务在新线程中一个接一个的执行。注意:只开一条新线程哦。