Kinnouka Bokudo

Kinnouka Bokudo

When you see me, and I try to be a good man, you see yourself.

马上订阅 Kinnouka Bokudo RSS 更新: https://kinnoukabokudo.com/feed

介绍 GCD 中的线程,队列,延迟执行,线程阻断,信号量,任务组与任务对象

Kinnouka Bokudo
2018年9月4日 00:00
开发
GCD 全称 Grand Central Dispatch,是 iOS 开发中最常使用的一种管理多线程的方式,也是苹果公司最为推崇的一种,GCD 最大的优点在于它的简单方便,虽然可能不如其他多线程管理方式那样灵活,但也能适用于绝大部分多线程中的情况。在 GCD 层面没有线程的概念,只有队列。任务都是以闭包的形式提交到对列上,然后 GCD 会自动创建线程去执行这些任务。 声明:笔者自身对 GCD 也是初学,而本文介绍的 GCD 知识也都是自己的一些理解,同时尽量不涉及过于原理性的内容,一切以普通工程师实用为目标原则。其中可以想象在很多地方会有理解的错误,还请多包涵。如您发现问题,也往不吝赐教指正,感激不尽。 线程 一个程序将执行某个操作的时候,就会将这个操作放在程序中的线程里去执行,一个程序可以拥有多个线程。因为有时程序需要同时执行多个操作,所以也就可以拥有多个线程。 线程可以是同步的,也可以是异步的。同步任务不会开启新的线程,所有任务会在当前线程中,按顺序一个个执行,执行完一个再执行下一个。异步任务彼此独立,互不影响,各自执行各自的任务,无需等待其他任务完成,在绝大多数情况下,执行异步任务时会创建新的线程。 队列 与线程的关系 线程是代码执行的路径,队列则是用于保存以及管理任务的,线程负责去队列中取任务进行执行。 分类 队列主要分为串行队列和并行队列两类:在串行队列中,任务按照其在队列中的顺序被调度,前一个任务执行完毕,才会开始执行下一个任务,串行队列一次只能执行一个任务。而在并行队列中,一次能同时执行多个任务,只要有空闲的线程,队列就会调度当前任务,交给线程去执行。并行是 CPU 的多核芯同时执行多个任务。 需要注意的是,并发,并发是指单核 CPU 在同一时间间隔内交替执行两个或多个任务。并行需要并发,但并发不能保证并行。并发是关于结构,而并行是关于执行。 在串行队列和并行队列的基础上,队列还可以继续细分为三类: 主队列:DispatchQueue.main 主队列在主线程上运行,是一个专门用来在主线程上调度任务的串行队列。所有的 UI 更新都必须放在主队列中。 全局队列:DispatchQueue.global() 全局队列是一个整个系统共享的并发队列。在使用多线程开发时,如果对队列没有特殊需求,在执行异步任务时,可以直接使用全局队列。 自定义队列:let customQueue = DispatchQueue(label: String, qos: DispatchQoS = .unspecified, attributes: DispatchQueue.Attributes = [], autoreleaseFrequency: DispatchQueue.AutoreleaseFrequency = .inherit, target: […]