NSThread
2018-02-10 本文已影响7人
Carson_Zhu
前言
- 进程
进程Process
是计算机中的程序关于某数据集合上的一次运行活动,在iOS
系统中,开启一个应用就打开了一个进程。 - 线程
线程Thread
是进程中的一个实体,程序执行的基本单元。在iOS
系统中,一个进程包含一个主线程,它的主要任务是处理UI
事件,显示和刷新UI
。 - 同步
在当前线程依次执行,不开启新的线程。 - 异步
多个任务情况下,一个任务A正在执行,同时可以执行另一个任务B。任务B不用等待任务A结束才执行。存在多条线程。 - 队列
存放任务的结构。 - 串行
线程执行只能依次逐一先后有序的执行。 - 并发
指两个或多个事件在同一时间间隔内发生。可以在某条线程和其他线程之间反复多次进行上下文切换,看上去就好像一个CPU
能够并且执行多个线程一样。其实是伪异步。 - 并行
指两个或多个事件在同一时刻发生。多核CUP
同时开启多条线程供多个任务同时执行,互不干扰。
简介
NSThread
是基于线程使用,轻量级的多线程编程方法(相对GCD
和NSOperation
),一个NSThread
对象代表一个线程,需要手动管理线程的生命周期,处理线程同步等问题。
方法介绍
创建线程
- 动态创建
动态方法返回一个新的NSThread
对象。/* * 指定方法创建 * selector :线程执行的方法,这个selector最多只能接收一个参数 * target :selector消息发送的对象 * argument : 传给selector的唯一参数,也可以是nil */ NSThread *dynamicThread = [[NSThread alloc] initWithTarget:self selector:@selector(dynamicThreadRun) object:nil]; // block方法创建 NSThread *newThread = [[NSThread alloc] initWithBlock:^{ // thread run }];
- 静态创建
静态方法没有返回值,如果需要获取新创建的thread
,需要在selector
中调用获取当前线程的方法。// 指定方法创建 [NSThread detachNewThreadSelector:@selector(staticThreadRun) toTarget:self withObject:nil]; // 指定block创建,iOS 10.0方法 if (@available(iOS 10.0, *)) { [NSThread detachNewThreadWithBlock:^{ // thread run }]; } else { // Fallback on earlier versions }
获取线程
- 获取当前线程
@property (class, readonly, strong) NSThread *currentThread; NSThread *currentThread = [NSThread currentThread];
- 获取主线程
@property (class, readonly, strong) NSThread *mainThread NSThread *mainThread = [NSThread mainThread];
控制线程
- 开启线程
- (void)start; [currentThread start];
- 暂停线程
+ (void)sleepUntilDate:(NSDate *)date; + (void)sleepForTimeInterval:(NSTimeInterval)ti; [NSThread sleepForTimeInterval:1.0]; (以暂停一秒为例) [NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:1.0]];
- 取消线程
- (void)cancel; // 取消线程并不会马上停止并退出线程,仅仅只作(线程是否需要退出)状态记录 [currentThread cancel];
- 停止线程
+ (void)exit; // 停止方法会立即终止除主线程以外所有线程(无论是否在执行任务)并退出 [NSThread exit];
判断线程
- 是否是主线程
@property (class, readonly) BOOL isMainThread BOOL result = [mainThread isMainThread];
- 是否取消
@property (readonly, getter=isCancelled) BOOL cancelled BOOL result = [currentThread isCancelled];
线程优先级
- iOS 8之前
+ (BOOL)setThreadPriority:(double)p; [NSThread setThreadPriority:1.0];
- iOS 8之后
@property NSQualityOfService qualityOfService; /* * NSQualityOfServiceUserInteractive:最高优先级,用于用户交互事件 * NSQualityOfServiceUserInitiated:次高优先级,用于用户需要马上执行的事件 * NSQualityOfServiceDefault:默认优先级,主线程和没有设置优先级的线程都默认为这个优先级 * NSQualityOfServiceUtility:普通优先级,用于普通任务 * NSQualityOfServiceBackground:最低优先级,用于不重要的任务 */ currentThread.qualityOfService = NSQualityOfServiceDefault;
线程间通信
- 指定主线程执行操作
[self performSelectorOnMainThread:@selector(threadAction) withObject:nil waitUntilDone:YES];
- 指定当前线程执行操作
// 指定线程执行方法和参数 [self performSelector:@selector(threadAction)]; [self performSelector:@selector(threadAction:) withObject:@"param"]; [self performSelector:@selector(threadAction:) withObject:@"param" afterDelay:2.0];
- 在指定线程上执行操作
[self performSelector:@selector(threadAction) onThread:thread withObject:nil waitUntilDone:YES];
线程锁
- NSLock
@property (nonatomic, strong) NSLock *lock; - (void)viewDidLoad { [super viewDidLoad]; self.lock = [[NSLock alloc] init]; [NSThread detachNewThreadSelector:@selector(threadRun) toTarget:self withObject:nil]; } - (void)threadRun { // 上锁 [self.lock lock]; // 需要的处理 // 解锁 [self.lock unlock]; }
- @synchronized
@synchronized (self) { // 需要的处理 }