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];

启动线程

         
     //分离一个新线程并启动线程,并且使用指定@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值属性:

获取主线程和当前线程

获取主线程:


  //获取主线程
  [NSThread mainThread];

  //判断当前线程是否为主线程
  if ([NSThread currentThread].isMainThread) {
     //...
  }
  //判断当前程序是否为多线程
  if([NSThread isMultiThreaded])
  {
      //...有些东西多线程是不安全的,可以在做处理。
  }

获取当前线程:

  //获取当前线程
  [NSThread currentThread];

线程属性

线程优先级

iOS8.0以后提供了系统资源竞争服务NSQualityOfService,类似线程优先级。QoS类值越高的线程可以获取更多的资源,NSQualityOfService主要有5个枚举值,优先级别从高到低排布:

  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//目前没什么实际意义

参考:
http://www.jianshu.com/p/8ed06312d8bd
Apple开发官方文档

上一篇 下一篇

猜你喜欢

热点阅读