这是我参与「第四届青训营 -IOS场」笔记创作活动的第3篇笔记
多线程基础概念
进程与线程
- 进程: 进程是程序运行的一个实例,是资源分配的最小单位,独立地运行在其受保护的内存空间
- 线程: 一个进程可以包括多个线程,线程是操作系统实施调度的最小单位
- 线程共享进程的内存空间以及一些进程级资源
- 每个线程有寄存器、栈、线程局部存储等私有数据
串行、并行、并发
- 串行:任务逐个有序执行,一个任务执行完毕再执行下一个任务
- 并行:多个任务在同一时刻被执行
- 并发:多个任务在同一时间段需要被执行
线程生命周期和线程调度
- 线程生命周期包括新建、就绪、运行、阻塞、死亡五种状态(五状态模型、三状态模型)
- 线程调度指的是当在单个处理器上运行多个线程,操作系统需要调度这些线程轮流执行,宏观上看起来这些线程在“同时”执行。不断在处理器上切换不同线程的行为称为线程调度。
Runloop和主线程
Runloop
Runloop是事件接收和分发机制的一个实现,可以让线程在适当的时间处理任务不会退出。iOS APP中,主线程的Runloop在程序运行时就会启动,其他线程的Runloop需要手动启动。Runloop的基本作用有,保持程序持续运行、处理程序中的各种事件、节省CPU资源提高程序性能,在必要的时候线程会被唤醒进行工作,否则会进入休眠,休眠时不占用CPU。
主线程
iOS App 启动时默认会开启一条线程,称为“主线程”。主线程默认开启 RunLoop,使得主线程可以及时刷新 UI 界面和处理 UI 交互事件(如点击、滑动、拖拽等),所以主线程又称为“UI 线程”。耗时操作会妨碍主线程中的主循环的执行,从而引起 App 卡顿问题。通过多线程编程,将耗时操作放到子线程执行,在必要时再回到主线程做刷新操作,可以使程序运行更加流畅。
多线程编程的优缺点
优点:
- 能适当地提高程序的执行效率
- 能适当地提高资源利用率
缺点:
- 创建线程、线程调度都是有开销成本的,如果开启大量线程,会降低程序的性能
- 需要谨慎处理线程安全问题,增加了程序设计的复杂度
OC多线程实现方案
- pthread
- NSThread
- GCD
- NSOperation
GCD
GCD(Grand Central Dispatch), GCD是Apple提供的异步执行任务的技术之一。GCD抽象出了任务和队列的概念,开发者不需要直接操作线程(像NSThread, 只需要定义好需要执行的任务,并追加到适当的派发队列。
任务:即需要在线程中执行的代码。
队列:即先进先出的队列,开发者将任务派发到队列,按照先进先出的顺序有系统派发到合适的对列进行处理。
- 串行队列:队列中的任务在单个线程中顺序执行,执行中的任务结束后才能继续执行下一个任务
- 并发队列:队列中的任务在异步执行的情况下可以分发到多个线程同时执行