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") |
重点
- 在串行队列中,使用同步执行,任务会在
当前线程中执行。注意:并不一定就是主线程哦, 而是在创建该串行队列时的所在线程。 - 在串行队列中,使用异步执行,任务会另外开启
一条新的线程来执行, 不会阻塞当前线程,任务在新线程中一个接一个的执行。注意:只开一条新线程哦。