多线程技术
多线程(multithreading)
是指软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。
原理
同一时间,CPU只能处理一条线程,只有一条线程在工作。
多线程并发执行,其实是CPU快速地在多线程之间调度(切换)。
如果CPU调度线程的时间足够快,就造成了多线程并发执行的假象(CPU并不是真正的同时执行多个任务)。
多线程技术方案对比
多线程技术方案 | 简介 | 语言 | 线程生命周期 | 使用频率 |
---|---|---|---|---|
pthread | 一套通用的多线程API;适用于Unix/Linux/Windows等系统;跨平台,可移植;使用难度大 | C | 程序员管理 | 几乎不用 |
NSThread | 使用更加面向对象;简单易用,可直接操作线程对象 | OC | 程序员管理 | 偶尔使用 |
GCD | 旨在替代NSThread等线程技术;充分利用设备的多核 | C | 自动管理 | 经常使用 |
NSOperation | 基于GCD(底层是GCD);比GCD多了一些简单实用的功能;使用更加面向对象 | OC | 自动管理 | 经常使用 |
多线程技术方案实现
1. NSThread
(1)使用NSThread对象建立一个线程非常方便;
(2)使用NSThread管理多个线程非常困难,不推荐使用;
(3)使用[NSThread currentThread]获得任务所在线程,适用于这三种技术。
2. GCD(Grand Central Dispatch)
(1)是基于C语言的底层API,可用于多核并行计算;
(2)用Block定义任务,使用起来非常灵活,GCD会自动管理线程的生命周期(创建线程、调度任务、销毁线程);
(3)提供了更多的控制能力以及操作队列中所不能使用的底层函数。
任务与队列
- 任务
即需要执行的操作,在GCD中任务是放在block里。执行的方式有两种:同步(sync)与异步(async),两者的主要区别在于是否具备开启新线程的能力。
- 同步(sync)
同步添加任务到指定的队列中,在队列中的正在执行的任务执行结束之前,会一直等待,直到该任务在所在队列中优先级高于本身的任务执行完毕之后才能开始执行。
不具备开启新线程的能力。
- 异步(async)
异步添加任务到指定的队列中,无需等待即可直接执行。
具备开启新线程的能力。
- 队列
即执行任务的等待队列,用来存放任务的队列。队列是一种特殊的线性表,采用FIFO(先进先出)的原则。
在GCD中队列分为串行队列(Serial Dispatch Queue)和并行队列(Concurrent Dispatch Queue)两种,两者的主要区别是:执行的顺序不同,开启线程数不同。
- 串行队列
每次只有一个任务被执行,让任务一个接着一个执行。(只开启一个子线程)
- 并行队列
可以让多个任务并发执行。(可以开启多个线程,并且同时执行任务)
注意:并发队列的并发功能只有在异步下才有效
3. NSOperation
(1)是使用GCD实现的一套Objective-C的API;
(2)是面向对象的线程技术;
(3)提供了一些GCD中不容易实现的特性,如:现在最大并发数量、操作之间的依赖关系。