- Mach是第一个以多线程方式处理任务的系统,因此多线程的底层实 现机制是基于Mach的线程
- 开发中很少用Mach级的线程,因为Mach级的线程没有提供多线程的基本特征,线程之间是独立的
- 开发中实现多线程的方案
•OC的NSThread
•C语言的GCD接口(性能最好,代码更精简)
•OC的NSOperation和NSOperationQueue(基于GCD)
GCD 内部实现
1> iOS和OS X的核心是XNU内核,GCD是基于XNU内核实现的
2> GCD的API全部在libdispatch库中
3> GCD的底层实现主要有Dispatch Queue和Dispatch Source
• Dispatch Queue :管理block(操作)
• Dispatch Source :处理事件
NSOperationQueue与GCD的实现机制和适用范围
1> GCD是纯C语言的API,NSOperationQueue是基于GCD的OC版本封装
2> GCD只支持FIFO的队列,NSOperationQueue可以很方便地调整执行顺 序、设置最大并发数量
3> NSOperationQueue可以在轻松在Operation间设置依赖关系,而GCD 需要写很多的代码才能实现
4> NSOperationQueue支持KVO,可以监测operation是否正在执行 (isExecuted)、是否结束(isFinished),是否取消(isCanceld)
5> GCD的执行速度比NSOperationQueue快 任务之间不太互相依赖:GCD 任务之间有依赖\或者要监听任务的执行情况:NSOperationQueue
GCD、NSOperationQueue比较
项目中使用 NSOperation的优点是 NSOperation 是对线程的高度抽象,在项目中使用它,会使项目的程序结构更好,子类化 NSOperation 的设计思路,是具有面向对 象的优点(复用、封装),使得实现是多线程支持,而接口简单,建议在复杂项目中 使用。项目中使用GCD的优点是 GCD 本身非常简单、易用,对于不复杂的多线程操作,会节省代码量,而Block 参数的使用,会是代码更为易读,建议在简单项目中 使用。
多线程GCD、NSOperationQueue、NSThread优缺点
NSThread:
优点:NSThread比其他两个轻量级
缺点:需要自己管理线程的生命周期、线程同步、加锁、睡眠以及唤醒等。线程同步对数据的加锁会有一定的系统开销。
NSOperation:
优点:不需要关心线程管理,数据同步的事情,可以把精力放在自己需要执行的操作上,NSOperation是面向对象的。创建NSOPeration子类的对象,把对象添加到NSOperationQueue队列里执行。
GCD(Grand Central Dispatch):
是苹果公司开发的一个多核编程的解决办法,在iOS4.0开始之后才能使用。GCD是一个替代诸如NSThread, NSOperationQueue,等技术的很高效和强大的技术。
dispatch queue分为三种:
1.主线程
Main queue,通过dispatch_get_main_queue获得
2.并行队列
global dispatch queue ,通过dispatch_get_global_queue获得,有系统创建三个不同优先级的dispatch queue。并行队列的执行顺序与其加入队列的顺序相同
3.串行队列
serial queues。一般用于按顺序同步访问,可创建任意数量的串行队列,各个串行队列之间是并发的,serial queues通过dispatch_queue_create创建。GCD的另一个用处是可以让程序在后台较长久的运行。