_3_GCD相关-Dispatch Queue

苹果官方对 GCD 的说明是这样的:

       开发者要做的只是定义想要执行的任务并追加到适当的 Dispatch Queue 中.

这句话用代码表示如下:

该代码中使用 Block 语法 "定义想执行的任务", 通过 dispatch_async 函数 "追加" 赋值到变量 queue 的 "Dispatch Queue中". 仅这样就可使指定的 Block 在某个线程中执行(关于 这个任务 在哪种线程执行, 我们后边慢慢聊).

"Dispatch Queue" 是什么?


如其名称所示: 是执行任务的等待队列. 当我们通过 dispatch_async 等API, 在 Block 中定义想执行的任务, 追加到 "Dispatch Queue" 中时, "Dispatch Queue" 会按照追加的顺序去执行处理.(First In-First Out)


两种"Dispatch Queue"


在执行处理时存在两种 "Dispatch Queue".

     一种是等待当前任务执行完成的 "Serial Dispatch Queue".

     另一种是不等待当前任务执行完成的"Concurrent Dispatch Queue".


"Serial Dispatch Queue"


_3_GCD相关-Dispatch Queue_第1张图片

当变量 queue 为 "Serial Dispatch Queue" 时, 因为要等待当前任务的结束,又因为 FIFO, 所以首先去执行第一个任务, 打印出 A, 接着第二个, 如此顺序执行下去.  同时执行的任务数只能有一个.



"Concurrent Dispatch Queue"


_3_GCD相关-Dispatch Queue_第2张图片

当变量 queue 为"Concurrent Dispatch Queue"时, 因为不用等待当前任务的结束, 所以在执行第一个任务时, 又重新生成一个线程, 去执行第二个任务, 如此, 当一个线程执行任务完成后,线程回到线程调度池, 等待执行下一个任务, 如图同一线程执行了两个任务.

关于生成的线程数


iOS 和 OSX 的核心 XNU 内核决定应当使用的线程数, 并只生成所需的线程执行处理. (系统级实现, 无须我们操心)

另外, 当执行的某个任务结束, 执行的任务数减少时, XNU 内核会结束不再需要的线程.  XNU 内核仅使用 "Concurrent Dispatch Queue"便可完美地管理并行执行多个处理的线程.



"Concurrent Dispatch Queue"她不同于执行顺序固定的"Serial Dispatch Queue". 在不能改变执行的处理顺序或不想并行执行多个处理时使用"Serial Dispatch Queue".


知道了有两种" Dispatch Queue ", 但是除了使用函数 dispatch_queue_create 之外还有什么方法还能得到这些" Dispatch Queue "呢?

我们下篇文章来聊.

End.

你可能感兴趣的:(_3_GCD相关-Dispatch Queue)