前言
多线程在iOS开发的过程中是十分常见的操作, 其中, 将任务放到子线程操作, 避免对主线程造成阻塞影响是最为常见的原因.
多线程的概念就不赘述了, 下面对串行, 并行; 同步, 异步的概念做二维对比解释.
写在前面:
说实话, 刚接触的时候, 对这四个概念着实头疼, 不好做区分, 总是混为一谈. 于是, 采用多方对比就会好理解一些.
我理解的单元任务分为三个阶段:
- 创建任务
- 将任务放到线程中执行
- 任务完成
下面, 我们做一个二维表格
线程 | 同步 | 异步 | 对比 |
---|---|---|---|
串行 | 在主线程操作, 任务一次执行, 执行完成后, 在执行主线程的内容 | 创建一个新的子线程, 所有任务在子线程操作, 线程内容的任务依次执行, 子线程和主线程的内容同时执行. | 是否阻塞主线程 |
并行 | 在主线程操作, 主线程任务等待, 所有任务同时创建, 但是在此队列中, 任务执行为依次执行, 没有轮到的任务处于等待状态, 执行完成后, 执行主线程内容 | 创建多条线程(未必有多少任务创建多少线程, 有点像cell的复用), 按顺序创建任务, 同时执行, 同时, 主线程任务正常执行. | 1. 是否阻塞主线程 2.任务的执行时间是否统一 |
1. 主线程阻塞等待 2. 任务的创建和执行时间点 | 1. 主线程异步执行, 不阻塞. 2. 任务的创建和执行时间点 |
如果, 上面的概念不好理解, 那么我们…
用手机打电话
任务单元:
- 存手机号(创建任务)
- 打电话(执行任务)
- 挂电话(任务完成)
在这里插入图片描述
素材
iPhone(主线程)
主要任务
需要用iPhone执行给老师打电话的任务
紧急任务
通知每个学生明天不要上学, 在家学习
四种不同组合的情况
-
串行同步:
只有一部iPhone, 根据通讯录列表, 依次存学生手机号, 给学生打完电话, 打完电话, 再存下一个…最后再给老师打电话
-
串行异步:
我再买一部华为Meta Pro, 用iPhone执行给老师打电话任务, 同时 用华为Meta Pro执行给所有学生依次打电话任务.
-
并行同步:
只有一部iPhone, 我先将所有学生的电话存到通讯录中, 然后依次给每个学生打电话, 最后, 我再执行给老师打电话的任务
-
并行异步:
执行给老师打电话任务, 同时, 执行给每个学生打电话的任务
写在后面
多线程的有点很明显, 更何况现在是多核的天下, 可以将多线程的性能最大化, 但是, 也是有缺点, 过度的使用多线程同样会造成CPU的压力倍增.
所以, 从实际角度出发, 多线程可以解决大部分卡顿问题, 但是也会造成卡顿, 我们可以在适当的时候给予用户等待的动画, 做到更好的交互.
概念性的东西实在不好理解, 如果文章中有错误地方, 还望指出.
图片素材来自网络, 如有侵权, 联系我删除.