1. 1. 正文:一、多线程使用要点:1)多线程使用并不是无节制的,iOS主线程的堆栈大小是1M左右,从第二个线程开始都是512KB(苹果API传送门) 2)只有主线程可以修改UI(显示图片,更改textView文字等),因为其余线程是独立于Cocoa Touch的,虽然有时在异步线程中可以实现更改界面,但是强烈不建议这么做 3)多线程并不能提高程序运行效率,而是通过并发任务提高资源使用率来提高系统的整体性能 就单核而言,两个线程可以解决线程阻塞问题,但执行效率比起一个线程执行是差不多的,并且在创建一个新线程的时候会消耗一定内存和CPU时间。多线程只是充分发挥系统多核处理器的优势,并发执行任务以提高效率。但是在哪个CPU上执行任务都是由系统调度的,我们不必太纠结系统有几个CPU,只要关心线程的使用以及线程之间的关心就可以了。 4)尽量不要用多个线程去抢夺共享资源,如果确实有必要这样做,需要注意线程安全 二、NSThread1)概述:NSThread 是一个轻量级的多线程技术,每一个对象代表一个线程。 优点:量级轻,使用简单 缺点:不能控制线程执行顺序,不能控制线程并发数,需要自己管理线程生命周期 2)开启一个异步线程// 1.类方法,直接新建线程调用某个耗时操作,新建线程后直接自动启动该线程[NSThread detachNewThreadSelector:@selector(threadLoadImage:) toTarget:self withObject:imageView]; // 2.成员方法,新建线程NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(threadLoadImage:) object:imageView];// 需要调用start方法来手动启动线程[thread start]; // 3.使用NSObject的类目方法,performSelectorInBackground 会新建一个后台线程,并在该线程中执行调用的方法[self performSelectorInBackground:@selector(threadLoadImage) withObject:imageView]; 以上三种方法效果一样,都是开启一个异步线程,并在线程中执行threadLoadImage:方法,只是使用是有细微差别 3)在主线程上执行任务(界面更新等操作)// 更新UI的操作需要在主线程操作// 因为performSelectorOnMainThread:是NSObject的扩展方法,所以任何对象都可以调用此方法[imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:YES]; 4)查看当前运行的线程// 该方法可以在三种线程技术中任意调用,num代表当前的线程号,主线程的线程号一定是1NSLog(@“当前运行的线程 %@", [NSThread currentThread]); 5)内存管理- (void)threadLoadImage:(UIImageView *)imageView { // 线程方法一定要加autoreleasepool @autoreleasepool { // 执行你需要的耗时操作 }} 6)线程休眠// 指定休眠到多久日期+ (void)sleepUntilDate:(NSDate *)date;// 指定休眠的毫秒数+ (void)sleepForTimeInterval:(NSTimeInterval)ti; 7)NSThread的一些属性介绍NSThread的大多属性都渐渐的被废弃了,所以在此只作为了解,不建议在开发中使用 // 线程的优先级,值在0-1之间,默认为0.5,1为最高优先级,但是调用是由系统决定的,所以指定优先级有时比一定那么准确。@property double threadPriority NS_AVAILABLE(10_6, 4_0); // To be deprecated; use qualityOfService below// 代替threadPriority属性来指定线程的优先级@property NSQualityOfService qualityOfService NS_AVAILABLE(10_10, 8_0); // read-only after the thread is started// 线程的名称@property (copy) NSString *name NS_AVAILABLE(10_5, 2_0);// 修改线程堆栈大小, 子线程最小的堆大小为16KB,堆的大小必须是4KB的倍数@property NSUInteger stackSize NS_AVAILABLE(10_5, 2_0);// 是否是主线程@property (readonly) BOOL isMainThread NS_AVAILABLE(10_5, 2_0); 三、关于NSOperation和GCD可以查看一下两篇文章参考资料: http://www.cnblogs.com/kenshincui/p/3983982.html
  2. 2. 正文:
  • 一、多线程使用要点:1)多线程使用并不是无节制的,iOS主线程的堆栈大小是1M左右,从第二个线程开始都是512KB(苹果API传送门) 2)只有主线程可以修改UI(显示图片,更改textView文字等),因为其余线程是独立于Cocoa Touch的,虽然有时在异步线程中可以实现更改界面,但是强烈不建议这么做 3)多线程并不能提高程序运行效率,而是通过并发任务提高资源使用率来提高系统的整体性能 就单核而言,两个线程可以解决线程阻塞问题,但执行效率比起一个线程执行是差不多的,并且在创建一个新线程的时候会消耗一定内存和CPU时间。多线程只是充分发挥系统多核处理器的优势,并发执行任务以提高效率。但是在哪个CPU上执行任务都是由系统调度的,我们不必太纠结系统有几个CPU,只要关心线程的使用以及线程之间的关心就可以了。 4)尽量不要用多个线程去抢夺共享资源,如果确实有必要这样做,需要注意线程安全 二、NSThread1)概述:NSThread 是一个轻量级的多线程技术,每一个对象代表一个线程。 优点:量级轻,使用简单 缺点:不能控制线程执行顺序,不能控制线程并发数,需要自己管理线程生命周期 2)开启一个异步线程// 1.类方法,直接新建线程调用某个耗时操作,新建线程后直接自动启动该线程[NSThread detachNewThreadSelector:@selector(threadLoadImage:) toTarget:self withObject:imageView]; // 2.成员方法,新建线程NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(threadLoadImage:) object:imageView];// 需要调用start方法来手动启动线程[thread start]; // 3.使用NSObject的类目方法,performSelectorInBackground 会新建一个后台线程,并在该线程中执行调用的方法[self performSelectorInBackground:@selector(threadLoadImage) withObject:imageView]; 以上三种方法效果一样,都是开启一个异步线程,并在线程中执行threadLoadImage:方法,只是使用是有细微差别 3)在主线程上执行任务(界面更新等操作)// 更新UI的操作需要在主线程操作// 因为performSelectorOnMainThread:是NSObject的扩展方法,所以任何对象都可以调用此方法[imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:YES]; 4)查看当前运行的线程// 该方法可以在三种线程技术中任意调用,num代表当前的线程号,主线程的线程号一定是1NSLog(@“当前运行的线程 %@", [NSThread currentThread]); 5)内存管理- (void)threadLoadImage:(UIImageView *)imageView { // 线程方法一定要加autoreleasepool @autoreleasepool { // 执行你需要的耗时操作 }} 6)线程休眠// 指定休眠到多久日期+ (void)sleepUntilDate:(NSDate *)date;// 指定休眠的毫秒数+ (void)sleepForTimeInterval:(NSTimeInterval)ti; 7)NSThread的一些属性介绍NSThread的大多属性都渐渐的被废弃了,所以在此只作为了解,不建议在开发中使用 // 线程的优先级,值在0-1之间,默认为0.5,1为最高优先级,但是调用是由系统决定的,所以指定优先级有时比一定那么准确。@property double threadPriority NS_AVAILABLE(10_6, 4_0); // To be deprecated; use qualityOfService below// 代替threadPriority属性来指定线程的优先级@property NSQualityOfService qualityOfService NS_AVAILABLE(10_10, 8_0); // read-only after the thread is started// 线程的名称@property (copy) NSString *name NS_AVAILABLE(10_5, 2_0);// 修改线程堆栈大小, 子线程最小的堆大小为16KB,堆的大小必须是4KB的倍数@property NSUInteger stackSize NS_AVAILABLE(10_5, 2_0);// 是否是主线程@property (readonly) BOOL isMainThread NS_AVAILABLE(10_5, 2_0); 三、关于NSOperation和GCD可以查看一下两篇文章参考资料: http://www.cnblogs.com/kenshincui/p/3983982.html
  • 一、多线程使用要点:
  • 二、NSThread1)概述:NSThread 是一个轻量级的多线程技术,每一个对象代表一个线程。 优点:量级轻,使用简单 缺点:不能控制线程执行顺序,不能控制线程并发数,需要自己管理线程生命周期 2)开启一个异步线程// 1.类方法,直接新建线程调用某个耗时操作,新建线程后直接自动启动该线程[NSThread detachNewThreadSelector:@selector(threadLoadImage:) toTarget:self withObject:imageView]; // 2.成员方法,新建线程NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(threadLoadImage:) object:imageView];// 需要调用start方法来手动启动线程[thread start]; // 3.使用NSObject的类目方法,performSelectorInBackground 会新建一个后台线程,并在该线程中执行调用的方法[self performSelectorInBackground:@selector(threadLoadImage) withObject:imageView]; 以上三种方法效果一样,都是开启一个异步线程,并在线程中执行threadLoadImage:方法,只是使用是有细微差别 3)在主线程上执行任务(界面更新等操作)// 更新UI的操作需要在主线程操作// 因为performSelectorOnMainThread:是NSObject的扩展方法,所以任何对象都可以调用此方法[imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:YES]; 4)查看当前运行的线程// 该方法可以在三种线程技术中任意调用,num代表当前的线程号,主线程的线程号一定是1NSLog(@“当前运行的线程 %@", [NSThread currentThread]); 5)内存管理- (void)threadLoadImage:(UIImageView *)imageView { // 线程方法一定要加autoreleasepool @autoreleasepool { // 执行你需要的耗时操作 }} 6)线程休眠// 指定休眠到多久日期+ (void)sleepUntilDate:(NSDate *)date;// 指定休眠的毫秒数+ (void)sleepForTimeInterval:(NSTimeInterval)ti; 7)NSThread的一些属性介绍NSThread的大多属性都渐渐的被废弃了,所以在此只作为了解,不建议在开发中使用 // 线程的优先级,值在0-1之间,默认为0.5,1为最高优先级,但是调用是由系统决定的,所以指定优先级有时比一定那么准确。@property double threadPriority NS_AVAILABLE(10_6, 4_0); // To be deprecated; use qualityOfService below// 代替threadPriority属性来指定线程的优先级@property NSQualityOfService qualityOfService NS_AVAILABLE(10_10, 8_0); // read-only after the thread is started// 线程的名称@property (copy) NSString *name NS_AVAILABLE(10_5, 2_0);// 修改线程堆栈大小, 子线程最小的堆大小为16KB,堆的大小必须是4KB的倍数@property NSUInteger stackSize NS_AVAILABLE(10_5, 2_0);// 是否是主线程@property (readonly) BOOL isMainThread NS_AVAILABLE(10_5, 2_0); 三、关于NSOperation和GCD可以查看一下两篇文章参考资料: http://www.cnblogs.com/kenshincui/p/3983982.html
  • 二、NSThread
    1. 1)概述:NSThread 是一个轻量级的多线程技术,每一个对象代表一个线程。 优点:量级轻,使用简单 缺点:不能控制线程执行顺序,不能控制线程并发数,需要自己管理线程生命周期 2)开启一个异步线程// 1.类方法,直接新建线程调用某个耗时操作,新建线程后直接自动启动该线程[NSThread detachNewThreadSelector:@selector(threadLoadImage:) toTarget:self withObject:imageView]; // 2.成员方法,新建线程NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(threadLoadImage:) object:imageView];// 需要调用start方法来手动启动线程[thread start]; // 3.使用NSObject的类目方法,performSelectorInBackground 会新建一个后台线程,并在该线程中执行调用的方法[self performSelectorInBackground:@selector(threadLoadImage) withObject:imageView]; 以上三种方法效果一样,都是开启一个异步线程,并在线程中执行threadLoadImage:方法,只是使用是有细微差别 3)在主线程上执行任务(界面更新等操作)// 更新UI的操作需要在主线程操作// 因为performSelectorOnMainThread:是NSObject的扩展方法,所以任何对象都可以调用此方法[imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:YES]; 4)查看当前运行的线程// 该方法可以在三种线程技术中任意调用,num代表当前的线程号,主线程的线程号一定是1NSLog(@“当前运行的线程 %@", [NSThread currentThread]); 5)内存管理- (void)threadLoadImage:(UIImageView *)imageView { // 线程方法一定要加autoreleasepool @autoreleasepool { // 执行你需要的耗时操作 }} 6)线程休眠// 指定休眠到多久日期+ (void)sleepUntilDate:(NSDate *)date;// 指定休眠的毫秒数+ (void)sleepForTimeInterval:(NSTimeInterval)ti; 7)NSThread的一些属性介绍NSThread的大多属性都渐渐的被废弃了,所以在此只作为了解,不建议在开发中使用 // 线程的优先级,值在0-1之间,默认为0.5,1为最高优先级,但是调用是由系统决定的,所以指定优先级有时比一定那么准确。@property double threadPriority NS_AVAILABLE(10_6, 4_0); // To be deprecated; use qualityOfService below// 代替threadPriority属性来指定线程的优先级@property NSQualityOfService qualityOfService NS_AVAILABLE(10_10, 8_0); // read-only after the thread is started// 线程的名称@property (copy) NSString *name NS_AVAILABLE(10_5, 2_0);// 修改线程堆栈大小, 子线程最小的堆大小为16KB,堆的大小必须是4KB的倍数@property NSUInteger stackSize NS_AVAILABLE(10_5, 2_0);// 是否是主线程@property (readonly) BOOL isMainThread NS_AVAILABLE(10_5, 2_0); 三、关于NSOperation和GCD可以查看一下两篇文章参考资料: http://www.cnblogs.com/kenshincui/p/3983982.html
    2. 1)概述:
    3. 2)开启一个异步线程// 1.类方法,直接新建线程调用某个耗时操作,新建线程后直接自动启动该线程[NSThread detachNewThreadSelector:@selector(threadLoadImage:) toTarget:self withObject:imageView]; // 2.成员方法,新建线程NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(threadLoadImage:) object:imageView];// 需要调用start方法来手动启动线程[thread start]; // 3.使用NSObject的类目方法,performSelectorInBackground 会新建一个后台线程,并在该线程中执行调用的方法[self performSelectorInBackground:@selector(threadLoadImage) withObject:imageView]; 以上三种方法效果一样,都是开启一个异步线程,并在线程中执行threadLoadImage:方法,只是使用是有细微差别 3)在主线程上执行任务(界面更新等操作)// 更新UI的操作需要在主线程操作// 因为performSelectorOnMainThread:是NSObject的扩展方法,所以任何对象都可以调用此方法[imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:YES]; 4)查看当前运行的线程// 该方法可以在三种线程技术中任意调用,num代表当前的线程号,主线程的线程号一定是1NSLog(@“当前运行的线程 %@", [NSThread currentThread]); 5)内存管理- (void)threadLoadImage:(UIImageView *)imageView { // 线程方法一定要加autoreleasepool @autoreleasepool { // 执行你需要的耗时操作 }} 6)线程休眠// 指定休眠到多久日期+ (void)sleepUntilDate:(NSDate *)date;// 指定休眠的毫秒数+ (void)sleepForTimeInterval:(NSTimeInterval)ti; 7)NSThread的一些属性介绍NSThread的大多属性都渐渐的被废弃了,所以在此只作为了解,不建议在开发中使用 // 线程的优先级,值在0-1之间,默认为0.5,1为最高优先级,但是调用是由系统决定的,所以指定优先级有时比一定那么准确。@property double threadPriority NS_AVAILABLE(10_6, 4_0); // To be deprecated; use qualityOfService below// 代替threadPriority属性来指定线程的优先级@property NSQualityOfService qualityOfService NS_AVAILABLE(10_10, 8_0); // read-only after the thread is started// 线程的名称@property (copy) NSString *name NS_AVAILABLE(10_5, 2_0);// 修改线程堆栈大小, 子线程最小的堆大小为16KB,堆的大小必须是4KB的倍数@property NSUInteger stackSize NS_AVAILABLE(10_5, 2_0);// 是否是主线程@property (readonly) BOOL isMainThread NS_AVAILABLE(10_5, 2_0); 三、关于NSOperation和GCD可以查看一下两篇文章参考资料: http://www.cnblogs.com/kenshincui/p/3983982.html
    4. 2)开启一个异步线程
    5. 3)在主线程上执行任务(界面更新等操作)// 更新UI的操作需要在主线程操作// 因为performSelectorOnMainThread:是NSObject的扩展方法,所以任何对象都可以调用此方法[imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:YES]; 4)查看当前运行的线程// 该方法可以在三种线程技术中任意调用,num代表当前的线程号,主线程的线程号一定是1NSLog(@“当前运行的线程 %@", [NSThread currentThread]); 5)内存管理- (void)threadLoadImage:(UIImageView *)imageView { // 线程方法一定要加autoreleasepool @autoreleasepool { // 执行你需要的耗时操作 }} 6)线程休眠// 指定休眠到多久日期+ (void)sleepUntilDate:(NSDate *)date;// 指定休眠的毫秒数+ (void)sleepForTimeInterval:(NSTimeInterval)ti; 7)NSThread的一些属性介绍NSThread的大多属性都渐渐的被废弃了,所以在此只作为了解,不建议在开发中使用 // 线程的优先级,值在0-1之间,默认为0.5,1为最高优先级,但是调用是由系统决定的,所以指定优先级有时比一定那么准确。@property double threadPriority NS_AVAILABLE(10_6, 4_0); // To be deprecated; use qualityOfService below// 代替threadPriority属性来指定线程的优先级@property NSQualityOfService qualityOfService NS_AVAILABLE(10_10, 8_0); // read-only after the thread is started// 线程的名称@property (copy) NSString *name NS_AVAILABLE(10_5, 2_0);// 修改线程堆栈大小, 子线程最小的堆大小为16KB,堆的大小必须是4KB的倍数@property NSUInteger stackSize NS_AVAILABLE(10_5, 2_0);// 是否是主线程@property (readonly) BOOL isMainThread NS_AVAILABLE(10_5, 2_0); 三、关于NSOperation和GCD可以查看一下两篇文章参考资料: http://www.cnblogs.com/kenshincui/p/3983982.html
    6. 3)在主线程上执行任务(界面更新等操作)
    7. 4)查看当前运行的线程// 该方法可以在三种线程技术中任意调用,num代表当前的线程号,主线程的线程号一定是1NSLog(@“当前运行的线程 %@", [NSThread currentThread]); 5)内存管理- (void)threadLoadImage:(UIImageView *)imageView { // 线程方法一定要加autoreleasepool @autoreleasepool { // 执行你需要的耗时操作 }} 6)线程休眠// 指定休眠到多久日期+ (void)sleepUntilDate:(NSDate *)date;// 指定休眠的毫秒数+ (void)sleepForTimeInterval:(NSTimeInterval)ti; 7)NSThread的一些属性介绍NSThread的大多属性都渐渐的被废弃了,所以在此只作为了解,不建议在开发中使用 // 线程的优先级,值在0-1之间,默认为0.5,1为最高优先级,但是调用是由系统决定的,所以指定优先级有时比一定那么准确。@property double threadPriority NS_AVAILABLE(10_6, 4_0); // To be deprecated; use qualityOfService below// 代替threadPriority属性来指定线程的优先级@property NSQualityOfService qualityOfService NS_AVAILABLE(10_10, 8_0); // read-only after the thread is started// 线程的名称@property (copy) NSString *name NS_AVAILABLE(10_5, 2_0);// 修改线程堆栈大小, 子线程最小的堆大小为16KB,堆的大小必须是4KB的倍数@property NSUInteger stackSize NS_AVAILABLE(10_5, 2_0);// 是否是主线程@property (readonly) BOOL isMainThread NS_AVAILABLE(10_5, 2_0); 三、关于NSOperation和GCD可以查看一下两篇文章参考资料: http://www.cnblogs.com/kenshincui/p/3983982.html
    8. 4)查看当前运行的线程
    9. 5)内存管理- (void)threadLoadImage:(UIImageView *)imageView { // 线程方法一定要加autoreleasepool @autoreleasepool { // 执行你需要的耗时操作 }} 6)线程休眠// 指定休眠到多久日期+ (void)sleepUntilDate:(NSDate *)date;// 指定休眠的毫秒数+ (void)sleepForTimeInterval:(NSTimeInterval)ti; 7)NSThread的一些属性介绍NSThread的大多属性都渐渐的被废弃了,所以在此只作为了解,不建议在开发中使用 // 线程的优先级,值在0-1之间,默认为0.5,1为最高优先级,但是调用是由系统决定的,所以指定优先级有时比一定那么准确。@property double threadPriority NS_AVAILABLE(10_6, 4_0); // To be deprecated; use qualityOfService below// 代替threadPriority属性来指定线程的优先级@property NSQualityOfService qualityOfService NS_AVAILABLE(10_10, 8_0); // read-only after the thread is started// 线程的名称@property (copy) NSString *name NS_AVAILABLE(10_5, 2_0);// 修改线程堆栈大小, 子线程最小的堆大小为16KB,堆的大小必须是4KB的倍数@property NSUInteger stackSize NS_AVAILABLE(10_5, 2_0);// 是否是主线程@property (readonly) BOOL isMainThread NS_AVAILABLE(10_5, 2_0); 三、关于NSOperation和GCD可以查看一下两篇文章参考资料: http://www.cnblogs.com/kenshincui/p/3983982.html
    10. 5)内存管理
    11. 6)线程休眠
    12. 7)NSThread的一些属性介绍NSThread的大多属性都渐渐的被废弃了,所以在此只作为了解,不建议在开发中使用 // 线程的优先级,值在0-1之间,默认为0.5,1为最高优先级,但是调用是由系统决定的,所以指定优先级有时比一定那么准确。@property double threadPriority NS_AVAILABLE(10_6, 4_0); // To be deprecated; use qualityOfService below// 代替threadPriority属性来指定线程的优先级@property NSQualityOfService qualityOfService NS_AVAILABLE(10_10, 8_0); // read-only after the thread is started// 线程的名称@property (copy) NSString *name NS_AVAILABLE(10_5, 2_0);// 修改线程堆栈大小, 子线程最小的堆大小为16KB,堆的大小必须是4KB的倍数@property NSUInteger stackSize NS_AVAILABLE(10_5, 2_0);// 是否是主线程@property (readonly) BOOL isMainThread NS_AVAILABLE(10_5, 2_0); 三、关于NSOperation和GCD可以查看一下两篇文章参考资料: http://www.cnblogs.com/kenshincui/p/3983982.html
    13. 7)NSThread的一些属性介绍
  • 三、关于NSOperation和GCD可以查看一下两篇文章参考资料: http://www.cnblogs.com/kenshincui/p/3983982.html
  • 三、关于NSOperation和GCD可以查看一下两篇文章
    1. 1. 参考资料: http://www.cnblogs.com/kenshincui/p/3983982.html
    2. 2. 参考资料:
  • 多线程技术之NSThread

    iOS程序在启动时会创建一个主线程,而在一个线程只能执行一件事情,如果在主线程执行某些耗时操作,例如加载网络图片,下载资源文件等会阻塞主线程(导致界面卡死,无法交互),所以就需要使用多线程技术来避免这类情况。iOS中有三种多线程技术 NSThread,NSOperation,GCD,这三种技术是随着IOS发展引入的,抽象层次由低到高,使用也越来越简单。本文将介绍一些多线程使用要点,及NSThread常用方法以和各自的优缺点。


    环境信息
    Mac OS X 10.10.1
    Xcode 6.1.1
    iOS 8.1
    正文:

    一、多线程使用要点:

    1)多线程使用并不是无节制的,iOS主线程的堆栈大小是1M左右,从第二个线程开始都是512KB(苹果API传送门

    2)只有主线程可以修改UI(显示图片,更改textView文字等),因为其余线程是独立于Cocoa Touch的,虽然有时在异步线程中可以实现更改界面,但是强烈不建议这么做

    3)多线程并不能提高程序运行效率,而是通过并发任务提高资源使用率来提高系统的整体性能

    就单核而言,两个线程可以解决线程阻塞问题,但执行效率比起一个线程执行是差不多的,并且在创建一个新线程的时候会消耗一定内存和CPU时间。多线程只是充分发挥系统多核处理器的优势,并发执行任务以提高效率。但是在哪个CPU上执行任务都是由系统调度的,我们不必太纠结系统有几个CPU,只要关心线程的使用以及线程之间的关心就可以了。

    4)尽量不要用多个线程去抢夺共享资源,如果确实有必要这样做,需要注意线程安全

    二、NSThread

    1)概述:

    NSThread 是一个轻量级的多线程技术,每一个对象代表一个线程。

    优点:量级轻,使用简单

    缺点:不能控制线程执行顺序,不能控制线程并发数,需要自己管理线程生命周期

    2)开启一个异步线程


    // 1.类方法,直接新建线程调用某个耗时操作,新建线程后直接自动启动该线程
    [NSThread detachNewThreadSelector:@selector(threadLoadImage:) toTarget:self withObject:imageView];

    // 2.成员方法,新建线程
    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(threadLoadImage:) object:imageView];
    // 需要调用start方法来手动启动线程
    [thread start];

    // 3.使用NSObject的类目方法,performSelectorInBackground 会新建一个后台线程,并在该线程中执行调用的方法
    [self performSelectorInBackground:@selector(threadLoadImage) withObject:imageView];

    以上三种方法效果一样,都是开启一个异步线程,并在线程中执行threadLoadImage:方法,只是使用是有细微差别

    3)在主线程上执行任务(界面更新等操作)


    // 更新UI的操作需要在主线程操作
    // 因为performSelectorOnMainThread:是NSObject的扩展方法,所以任何对象都可以调用此方法
    [imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:YES];

    4)查看当前运行的线程


    // 该方法可以在三种线程技术中任意调用,num代表当前的线程号,主线程的线程号一定是1
    NSLog(@“当前运行的线程 %@", [NSThread currentThread]);

    5)内存管理


    - (void)threadLoadImage:(UIImageView *)imageView {

    // 线程方法一定要加autoreleasepool
    @autoreleasepool {
    // 执行你需要的耗时操作
    }
    }

    6)线程休眠


    // 指定休眠到多久日期
    + (void)sleepUntilDate:(NSDate *)date;

    // 指定休眠的毫秒数
    + (void)sleepForTimeInterval:(NSTimeInterval)ti;

    7)NSThread的一些属性介绍

    NSThread的大多属性都渐渐的被废弃了,所以在此只作为了解,不建议在开发中使用


    // 线程的优先级,值在0-1之间,默认为0.5,1为最高优先级,但是调用是由系统决定的,所以指定优先级有时比一定那么准确。
    @property double threadPriority NS_AVAILABLE(10_6, 4_0); // To be deprecated; use qualityOfService below

    // 代替threadPriority属性来指定线程的优先级
    @property NSQualityOfService qualityOfService NS_AVAILABLE(10_10, 8_0); // read-only after the thread is started

    // 线程的名称
    @property (copy) NSString *name NS_AVAILABLE(10_5, 2_0);

    // 修改线程堆栈大小, 子线程最小的堆大小为16KB,堆的大小必须是4KB的倍数
    @property NSUInteger stackSize NS_AVAILABLE(10_5, 2_0);

    // 是否是主线程
    @property (readonly) BOOL isMainThread NS_AVAILABLE(10_5, 2_0);

    三、关于NSOperation和GCD可以查看一下两篇文章

    参考资料:

    http://www.cnblogs.com/kenshincui/p/3983982.html