iOS多线程开发之NSThread

一、NSThread基本概念

      NSThread是基于线程使用,轻量级的多线程编程方法(相对GCD和NSOperation),一个NSThread对象代表一个线程,需要手动管理线程的生命周期,处理线程同步等问题。

 

二、创建、启动线程

      1、动态实例化 - 先创建再人工启动

NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(loadingImage) object:nil];

// 线程启动,在线程thread中执行self的loadingImage方法
[thread start];   

      2、静态实例化 - 创建后自启动

// 创建自启动,执行loadingImage方法
[NSThread detachNewThreadSelector:@selector(loadingImage) toTarget:self withObject:nil];

      3、隐式实例化 - 创建后自启动

// 创建自启动,执行loadingImage方法
[self performSelectorInBackground:@selector(loadingImage) withObject:nil];

 

三、线程控制

     1、暂停 

+ (void)sleepUntilDate:(NSDate *)date;
+ (void)sleepForTimeInterval:(NSTimeInterval)ti;

      NSThread的暂停会阻塞当前线程  

      2、取消

- (void)cancel

      NSThread的取消线程并不是马上停止并退出线程,只作(线程是否需要退出)状态标记

     3、线程停止

+ (void)exit

     NSThread的停止方法会立即终止除主线程以外所有线程(无论是否在执行任务)并退出,慎用! 否则可能会导致内存问题

 

四、NSThread的拓展认识

      1、一些常用方法

// 获得主线程
+ (NSThread *)mainThread;    

// 判断是否为主线程(对象方法)
- (BOOL)isMainThread;

// 判断是否为主线程(类方法)
+ (BOOL)isMainThread;    

// 获得当前线程
NSThread *current = [NSThread currentThread];

     2、线程优先级设置

//iOS8之前
[NSThread setThreadPriority:1.0];  // (0.0,-1.0,1.0)
 
-----------------------------分割线------------------------------

//iOS8之后
[NSThread setQualityOfService:NSQualityOfServiceUserInitiated];

/*
  qualityOfService的枚举值如下:
 NSQualityOfServiceUserInteractive:最高优先级,用于用户交互事件
 NSQualityOfServiceUserInitiated:次高优先级,用于用户需要马上执行的事件
 NSQualityOfServiceDefault:默认优先级,主线程和没有设置优先级的线程都默认为这个优先级
 NSQualityOfServiceUtility:普通优先级,用于普通任务
 NSQualityOfServiceBackground:最低优先级,用于不重要的任务
*/

     3、线程间的通信

// 1、指定当前线程执行操作
[self performSelector:@selector(run)];
[self performSelector:@selector(run) withObject:nil];
[self performSelector:@selector(run) withObject:nil afterDelay:3.0f];

-----------------------------分割线------------------------------------------

// 2、指定在主线程执行操作(如更新UI)
[self performSelectorOnMainThread:@selector(run) withObject:nil waitUntilDone:YES];

-----------------------------分割线------------------------------------------

// 3、指定在其他线程操作(主线程->新线程)

// 这里指定为某个线程newThread
[self performSelector:@selector(run) onThread:newThread withObject:nil waitUntilDone:YES]; 

// 这里指定为后台线程
[self performSelectorInBackground:@selector(run) withObject:nil];

 

五、线程同步

      多线程不可避免的会带来不同线程并发执行时争夺共享资源的问题(如内存,数据源等),这会造成数据的不一致(脏数据),甚至严重的引起死锁。

      线程同步是指是指在一定的时间内只允许某一个线程访问某个资源,这就像是GCD里的栅栏(dispatch_barrier)或者信号量(dispatch_semphore)一样

      目前iOS实现线程加锁有NSLock和@synchronized两种方式

      关于线程锁的更多相关知识,请参考文章:http://www.jianshu.com/p/35dd92bcfe8c

   

 

posted @ 2017-07-13 15:16  贝克的飞机  阅读(460)  评论(0编辑  收藏  举报