iOS多线程开发(一)多线程基础
前言
前段时间给项目添加了图片的传送与下载的功能,由于当时工期紧凑,并没有理会性能问题。闲暇之余,想起来给项目优化一下性能,于是决定研究一下多线程技术。
多线程
,引用百度百科上面的话,就是指从软件或硬件上实现多个线程并发执行
的技术。使用多线程的优点就在于可以把占据时间长得任务放在后台线程中去执行,避免影响主线程的运行,避免出现用户长时间等待操作,可以极好地提高程序的性能。iOS中的多线程
在iOS开发中,有三种使用多线程开发的技术:
NSThread
、NSOperation
和GCD
。这三种多线程技术抽象度
依次是越来越高,而抽象程度越高,使用起来越简单。我会在后面的文章中具体地讲述每一种多线程技术。
进程与线程
简单地说,进程
是一个正在运行的程序的实例
,拥有自己的地址空间,是系统资源分配和调度的一个独立单位;而线程
则是进程中的一个实体,有时亦被称作是轻量级的进程
。关于进程
与线程
的具体区分,我推荐大家可以阅读这篇博客进程与线程的一个简单解释。
队列
学过数据结构的朋友应该都清楚队列
的含义,它是一种常用的数据结构
,是一种特殊的线性表,拥有FIFO
(先进先出)的特性。在iOS多线程开发中,会经常使用到这种数据结构来存储线程。
串行队列与并行队列
iOS开发中的串行队列
,指的是在队列中,所有的任务都是按顺序一条一条执行的,只有完成了上一条任务,才能执行下一条任务;而并行队列
指的是一个队列中所有任务是可以同时运行的。
同步与异步
同步
与异步
操作,针对的是线程这一级别的运行逻辑。同步
是指在当前的线程中执行任务,不具备开辟新线程
的能力;异步
操作是指在新线程中执行任务,具有开辟新线程
的能力。
基本规则:
- 串行队列中的任务会按顺序执行,并行队列中的任务通常会并发执行,而且无法确定任务的执行顺序。
- 异步操作会新开辟线程来执行任务,而且无法确定执行顺序,同步操作不会新开辟线程
- 在串行队列中执行同步任务:不会新建线程,按顺序执行任务
- 在串行队列中执行异步任务,会新建线程,按顺序执行任务
- 在并行队列中执行同步任务:不会新建线程,按顺序执行任务
- 在并行队列中执行异步任务:会新建多个线程,但是无法确定任务的执行顺序
- 全局队列是系统的,直接拿过来就可以用,与并行队列类似,但是不能指定队列的名字,调试时无法确认任务所在队列
- 在全局队列中执行同步任务:不会新建线程,按顺序执行任务
- 在全局队列中执行异步任务:会新建多个线程,但是无法确定任务的执行顺序
- 每一个应用程序只有一个主线程即只有一个主队列
- 在ios开发中,所有UI的更新任务都必须在主线程上执行。
- 主队列中的操作都是主线程中执行的,不存在异步的概念
- 主队列中添加的同步操作永远不会被执行会死锁