NSThread

作者: Carson_Zhu | 来源:发表于2018-02-10 23:20 被阅读7次

    前言

    • 进程
      进程Process是计算机中的程序关于某数据集合上的一次运行活动,在iOS系统中,开启一个应用就打开了一个进程。
    • 线程
      线程Thread是进程中的一个实体,程序执行的基本单元。在iOS系统中,一个进程包含一个主线程,它的主要任务是处理UI事件,显示和刷新UI
    • 同步
      在当前线程依次执行,不开启新的线程。
    • 异步
      多个任务情况下,一个任务A正在执行,同时可以执行另一个任务B。任务B不用等待任务A结束才执行。存在多条线程。
    • 队列
      存放任务的结构。
    • 串行
      线程执行只能依次逐一先后有序的执行。
    • 并发
      指两个或多个事件在同一时间间隔内发生。可以在某条线程和其他线程之间反复多次进行上下文切换,看上去就好像一个CPU能够并且执行多个线程一样。其实是伪异步。
    • 并行
      指两个或多个事件在同一时刻发生。多核CUP同时开启多条线程供多个任务同时执行,互不干扰。

    简介

    NSThread是基于线程使用,轻量级的多线程编程方法(相对GCDNSOperation),一个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) {
        // 需要的处理
      }
      

    相关文章

      网友评论

          本文标题:NSThread

          本文链接:https://www.haomeiwen.com/subject/fkwhtftx.html