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