NSThread
2016-12-27 本文已影响0人
玄裳
初始化方法
系统提供线程的三种初始化方式:
//初始化方式1
NSThread *thread = [[NSThread alloc] init];
[thread start];
______________________________________________________________________________________________
//初始化方式2
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(executeTask) object:@"leona"];
[thread start];
______________________________________________________________________________________________
//初始化方式3 iOS10以后才能使用
NSThread *thread = [[NSThread alloc] initWithBlock:^{
NSLog(@"%@",[NSThread currentThread]);
}];
[thread start];
启动线程
- 通过 初始化方法创建的线程需要手动调用start/main方法来启动线程。
- 通过detach方法可直接创建并启动一个线程执行任务 __ ,但是没有返回值,如果需要获取新创建的Thread,需要在执行的selector中通过调用[NSThread currentThread]__函数获取
//分离一个新线程并启动线程,并且使用指定@selector名作为入口点,
[NSThread detachNewThreadSelector:@selector(newThread) toTarget:self withObject:@"leona"];
//iOS10以后才可以使用,同上。
[NSThread detachNewThreadWithBlock:^{
NSLog(@"");
}];
______________________________________________________________________________________________
NSThread *thread = [[NSThread alloc] initWithBlock:^{
NSLog(@"%@",[NSThread currentThread]);
}];
//手动启动一个线程,start方法作为启动线程入口点
[thread start];
______________________________________________________________________________________________
NSThread *thread = [[NSThread alloc] initWithBlock:^{
NSLog(@"%@",[NSThread currentThread]);
}];
//手动启动一个线程,main方法作为启动线程入口点
[thread main];
停止线程
NSThread提供了让线程睡眠、取消、退出的方法来停止线程。
类方法:
//执行一个sleep的任务 其他任务不响应,sleep任务结束后才响应其他任务
[NSThread sleepUntilDate:(NSDate *)date];
——————————————————————————————————————————————————————————————————————————————————————————————
//每隔一段时间休眠一次
[NSThread sleepForTimeInterval:3.f];
——————————————————————————————————————————————————————————————————————————————————————————————
//对于有RunLoop的线程,可以使用CFRunLoopStop()配合-cancel来结束线程。但必须使用runMode:beforeDate:启动RunLoop,否则CFRunLoopStop()无法响应。
- (void)endThread
{
[[NSThread currentThread] cancel];
CFRunLoopStop(CFRunLoopGetCurrent());
}
——————————————————————————————————————————————————————————————————————————————————————————————
//暴力退出线程,即使任务没有完成,也会立即退出。容易导致内存泄漏
[NSThread exit];
实例方法:
NSThread *thread = [[NSThread alloc] init];
//这个方法只能把isCancelled属性的状态设置为YES,并不能真正的取消线程。
[thread cancel];
——————————————————————————————————————————————————————————————————————————————————————————————
//只读属性,用来检查线程的状态,手动退出线程
if (thread.isCancelled) {
return;
}
PS: 真正的取消线程需要我们自己在main函数里面定期检查isCancelled属性的状态来判断是否手动退出线程,如果没有在main函数中检查isCancelled属性的状态,那么调用cancel函数没有任何意义。
线程的状态
线程状态提供了三个只读的BOOL值属性:
- executing //判断是否正在执行
- finished //判断是否已经完成
- cancelled //判断是否已经取消
获取主线程和当前线程
获取主线程:
//获取主线程
[NSThread mainThread];
//判断当前线程是否为主线程
if ([NSThread currentThread].isMainThread) {
//...
}
//判断当前程序是否为多线程
if([NSThread isMultiThreaded])
{
//...有些东西多线程是不安全的,可以在做处理。
}
获取当前线程:
//获取当前线程
[NSThread currentThread];
线程属性
- threadDictionary//可以存一些关于线程的操作,可自定义键值。
- name//线程名字,调试的时候可以用来分辨是哪个线程
- stackSize//设置栈的大小
线程优先级
iOS8.0以后提供了系统资源竞争服务NSQualityOfService,类似线程优先级。QoS类值越高的线程可以获取更多的资源,NSQualityOfService主要有5个枚举值,优先级别从高到低排布:
- NSQualityOfServiceUserInteractive:最高优先级,主要用于提供交互UI的操作,比如处理点击事件,绘制图像到屏幕上
- NSQualityOfServiceUserInitiated:次高优先级,主要用于执行需要立即返回的任务
- NSQualityOfServiceDefault:默认优先级,当没有设置优先级的时候,线程默认优先级
- NSQualityOfServiceUtility:普通优先级,主要用于不需要立即返回的任务
- NSQualityOfServiceBackground:后台优先级,用于完全不紧急的任务
NSThread *thread = [[NSThread alloc] init];
//必须在启动线程之前调用,否则会失效。Qos越高的线程可以获取更多的资源
thread.qualityOfService = NSQualityOfServiceDefault;
//设置当前线程的优先级,默认是0.0-1.0,1.0优先级最高。不过此方法已经被弃用了,推荐使用上面的方法。
thread.threadPriority = 0.5f;
//同threadPriority
[thread setThreadPriority: 0.5f];
通知
NSDidBecomeSingleThreadedNotification//目前没什么实际意义
- NSThreadWillExitNotification//退出线程的之前会发送这个通知
- NSWillBecomeMultiThreadedNotification //由当前线程分离出第一个其他线程时发送,一般只发送一次,后面再分离的线程不会再发送此通知。
参考:
http://www.jianshu.com/p/8ed06312d8bd
Apple开发官方文档