多线程处理方式及优缺点
来源:互联网 发布:甲骨文软件测试面试 编辑:程序博客网 时间:2024/06/11 03:39
iOS有四种多线程编程的技术,分别是:NSThread,Cocoa NSOperation,GCD(全称:Grand Central Dispatch),pthread。
四种方式的优缺点介绍:
1)NSThread优点:NSThread 比其他两个轻量级。缺点:需要自己管理线程的生命周期,线程同步。线程同步对数据的加锁会有一定的系统开销。
2)Cocoa NSOperation优点:不需要关心线程管理, 数据同步的事情,可以把精力放在自己需要执行的操作上。Cocoa operation相关的类是NSOperation, NSOperationQueue.NSOperation是个抽象类,使用它必须用它的子类,可以实现它或者使用它定义好的两个子类: NSInvocationOperation和NSBlockOperation.创建NSOperation子类的对象,把对象添加到NSOperationQueue队列里执行。
3)GCD(全优点)Grand Central dispatch(GCD)是Apple开发的一个多核编程的解决方案。在iOS4.0开始之后才能使用。GCD是一个替代NSThread, NSOperationQueue,NSInvocationOperation等技术的很高效强大的技术。
4) pthread是一套通用的多线程API,适用于Linux\Windows\Unix,跨平台,可移植,使用C语言,生命周期需要程序员管理,IOS开发中使用很少。
GCD线程死锁
GCD 确实好用也很强大,但不像NSOpretion可以取消任务。
GCD 用不好可能会出现线程死锁。
如下代码:
GCD Queue 分为三种:
1)The main queue:主队列,主线程就是在个队列中。
2)Global queues: 全局并发队列。
3)用户队列:是用函数 dispatch_queue_create创建的自定义队列
dispatch_sync 和 dispatch_async 区别:
1)dispatch_async(queue,block) async 异步队列,dispatch_async函数会立即返回, block会在后台异步执行。
2)dispatch_sync(queue,block) sync 同步队列,dispatch_sync函数不会立即返回,及阻塞当前线程,等待 block同步执行完成。
分析上面代码:
viewDidLoad 在主线程中, 及在dispatch_get_main_queue() 中,执行到sync 时 向dispatch_get_main_queue()插入 同步 threed。sync 会等到 后面block 执行完成才返回, sync 又再 dispatch_get_main_queue() 队列中,它是串行队列,sync 是后加入的,前一个是主线程,所以 sync 想执行 block 必须等待主线程执行完成,主线程等待 sync 返回,去执行后续内容。照成死锁,sync 等待mainThread 执行完成, mianThread 等待sync 函数返回。
下面例子:
程序会完成执行,为什么不会出现死锁。
首先: async 在主线程中 创建了一个异步线程 加入 全局并发队列,async 不会等待block 执行完成,立即返回,
1)async 立即返回, viewDidLoad 执行完毕,及主线程执行完毕。
2)同时,全局并发队列立即执行异步 block , 打印 1, 当执行到 sync 它会等待 block 执行完成才返回, 及等待dispatch_get_main_queue() 队列中的 mianThread 执行完成, 然后才开始调用block 。因为1 和 2 几乎同时执行,因为2 在全局并发队列上, 2 中执行到sync 时 1 可能已经执行完成或 等了一会,mainThread 很快退出, 2 等已执行后继续内容。如果阻塞了主线程,2 中的sync 就无法执行啦,mainThread 永远不会退出, sync 就永远等待着。
四种方式的优缺点介绍:
1)NSThread优点:NSThread 比其他两个轻量级。缺点:需要自己管理线程的生命周期,线程同步。线程同步对数据的加锁会有一定的系统开销。
2)Cocoa NSOperation优点:不需要关心线程管理, 数据同步的事情,可以把精力放在自己需要执行的操作上。Cocoa operation相关的类是NSOperation, NSOperationQueue.NSOperation是个抽象类,使用它必须用它的子类,可以实现它或者使用它定义好的两个子类: NSInvocationOperation和NSBlockOperation.创建NSOperation子类的对象,把对象添加到NSOperationQueue队列里执行。
3)GCD(全优点)Grand Central dispatch(GCD)是Apple开发的一个多核编程的解决方案。在iOS4.0开始之后才能使用。GCD是一个替代NSThread, NSOperationQueue,NSInvocationOperation等技术的很高效强大的技术。
4) pthread是一套通用的多线程API,适用于Linux\Windows\Unix,跨平台,可移植,使用C语言,生命周期需要程序员管理,IOS开发中使用很少。
GCD线程死锁
GCD 确实好用也很强大,但不像NSOpretion可以取消任务。
GCD 用不好可能会出现线程死锁。
如下代码:
- (void)viewDidLoad{ [super viewDidLoad]; NSLog(@"=================4"); dispatch_sync(dispatch_get_main_queue(), ^{ NSLog(@"=================5"); }); NSLog(@"=================6");}
GCD Queue 分为三种:
1)The main queue:主队列,主线程就是在个队列中。
2)Global queues: 全局并发队列。
3)用户队列:是用函数 dispatch_queue_create创建的自定义队列
dispatch_sync 和 dispatch_async 区别:
1)dispatch_async(queue,block) async 异步队列,dispatch_async函数会立即返回, block会在后台异步执行。
2)dispatch_sync(queue,block) sync 同步队列,dispatch_sync函数不会立即返回,及阻塞当前线程,等待 block同步执行完成。
分析上面代码:
viewDidLoad 在主线程中, 及在dispatch_get_main_queue() 中,执行到sync 时 向dispatch_get_main_queue()插入 同步 threed。sync 会等到 后面block 执行完成才返回, sync 又再 dispatch_get_main_queue() 队列中,它是串行队列,sync 是后加入的,前一个是主线程,所以 sync 想执行 block 必须等待主线程执行完成,主线程等待 sync 返回,去执行后续内容。照成死锁,sync 等待mainThread 执行完成, mianThread 等待sync 函数返回。
下面例子:
- (void)viewDidLoad{ [super viewDidLoad]; dispatch_async(dispatch_get_global_queue(0, 0), ^{ NSLog(@"=================1"); dispatch_sync(dispatch_get_main_queue(), ^{ NSLog(@"=================2"); }); NSLog(@"=================3"); });}
程序会完成执行,为什么不会出现死锁。
首先: async 在主线程中 创建了一个异步线程 加入 全局并发队列,async 不会等待block 执行完成,立即返回,
1)async 立即返回, viewDidLoad 执行完毕,及主线程执行完毕。
2)同时,全局并发队列立即执行异步 block , 打印 1, 当执行到 sync 它会等待 block 执行完成才返回, 及等待dispatch_get_main_queue() 队列中的 mianThread 执行完成, 然后才开始调用block 。因为1 和 2 几乎同时执行,因为2 在全局并发队列上, 2 中执行到sync 时 1 可能已经执行完成或 等了一会,mainThread 很快退出, 2 等已执行后继续内容。如果阻塞了主线程,2 中的sync 就无法执行啦,mainThread 永远不会退出, sync 就永远等待着。
0 0
- 多线程处理方式及优缺点
- (转载)android多线程及定时器处理方式
- Android多线程方式处理图片下载及显示
- session共享处理方式优缺点
- IOS多线程三种方式的优缺点
- 三种出错处理方式各自优缺点
- php 多进程及多线程的优缺点
- 多线程的处理方式
- Android 注册广播有几种方式及优缺点
- Android 注册广播有几种方式及优缺点
- 面试之xml解析方式及优缺点
- 简述Andriod如何处理UI与耗时操作的通信,有哪些方式及各自的优缺点。
- 多线程优缺点
- 多线程问题及处理
- 多线程及异步处理
- 多线程问题及处理
- 多线程问题及处理
- 多线程问题及处理
- ubuntu sublime text的安装
- android自定义view之自定义RatingBar
- log4j使用教程
- Java ConcurrentModificationException异常原因和解决方法
- nyoj 28大数阶乘
- 多线程处理方式及优缺点
- 【42】android Context深度剖析
- 关于linux下编译math函数的参数
- Unity 里双击脚本打不开的解决方法
- opencv
- How deep are your unit tests?
- 笔试面试13--给定 x, k ,求满足 x + y = x | y 的第 k 小的正整数 y
- XPO开发指南简要
- 线程和进程