标签:
iOS中的多线程技术
我们在iOS开发项目过程中,为了解决UI界面操作不被耗时操作阻塞,我们会使用到多线程技术。在iOS开发中,我们主要会用到三种多线程操作技术:NSThread,NSOperation,GCD。
1.Thread :是三种方法里面相对轻量级的,但需要管理线程的生命周期、同步、加锁问题,这会导致一定的性能开销
2.Cocoa Operations:是基于OC实现的,NSOperation以面向对象的方式封装了需要执行的操作,不必关心线程管理、同步等问题。NSOperation是一个抽象基类,iOS提供了两种默认实现:NSInvocationOperation和NSBlockOperation,当然也可以自定义NSOperation
3.Grand Central Dispatch(简称GCD,iOS4才开始支持):提供了一些新特性、运行库来支持多核并行编程,它的关注点更高:如何在多个cpu上提升效率
这篇文章主要将第一种多线程操作技术NSThread。
线程分类
1> 主线程 : UI线程,显示、刷新UI界面,处理UI控件的事件
2> 子线程 : 后台线程,异步线程
注意点:不要把耗时的操作放在主线程,要放在子线程中执行,因为主线程包含用户界面的操作,因此减少主线程执行耗时操作,重要的原因是为了避免挑战用户耐心。
NSThread常用操作
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil]; [thread start]; // 线程一启动,就会在线程thread中执行self的run方法
+ (NSThread *)mainThread; // 获得主线程 - (BOOL)isMainThread; // 是否为主线程 + (BOOL)isMainThread; // 是否为主线程
NSThread *current = [NSThread currentThread];
+ (double)threadPriority; + (BOOL)setThreadPriority:(double)p; - (double)threadPriority; - (BOOL)setThreadPriority:(double)p;
调度优先级的取值范围是0.0 ~ 1.0,默认0.5,值越大,优先级越高
- (void)setName:(NSString *)n; - (NSString *)name;
[NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];
[self performSelectorInBackground:@selector(run) withObject:nil];
上述2种创建线程方式的优缺点
线程的状态
如下图,展示线程的在不同时期的状态
2.线程状态的控制方法
- (void)start; // 进入就绪状态 -> 运行状态。当线程任务执行完毕,自动进入死亡状态
+ (void)sleepUntilDate:(NSDate *)date; + (void)sleepForTimeInterval:(NSTimeInterval)ti;
// 进入阻塞状态
+ (void)exit; // 进入死亡状态
注意:一旦线程停止(死亡)了,就不能再次开启任务
多线程的安全隐患
如下图所示的线程安全隐患分析:
为了解决如图所示的问题,我们可以使用NSThread中的互斥锁技术,如下图所示:
安全隐患解决 – 互斥锁
@synchronized(锁对象) { // 需要锁定的代码 }
注意:锁定1份代码只用1把锁,用多把锁是无效的
优点:能有效防止因多线程抢夺资源造成的数据安全问题
缺点:需要消耗大量的CPU资源
线程同步的意思是:多条线程在同一条线上执行(按顺序地执行任务)
互斥锁,就是使用了线程同步技术
原子和非原子属性
atomic:原子属性,为setter方法加锁(默认就是atomic)
nonatomic:非原子属性,不会为setter方法加锁
原子和非原子属性的选择
nonatomic和atomic对比
2.iOS开发的建议
线程间通信
在1个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信
1个线程传递数据给另1个线程
在1个线程中执行完特定任务后,转到另1个线程继续执行任务
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait; - (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait;
标签:
原文地址:http://www.cnblogs.com/JackieHoo/p/5024907.html