Objective-C 多线程编程与GCD | 青训营笔记

149 阅读3分钟

这是我参与「第四届青训营 -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, 只需要定义好需要执行的任务,并追加到适当的派发队列

任务:即需要在线程中执行的代码。

队列:即先进先出的队列,开发者将任务派发到队列,按照先进先出的顺序有系统派发到合适的对列进行处理。

  • 串行队列:队列中的任务在单个线程中顺序执行,执行中的任务结束后才能继续执行下一个任务
  • 并发队列:队列中的任务在异步执行的情况下可以分发到多个线程同时执行