iOS多线程-NSThread

在IOS多线程中NSThread这种方式虽然简单易用,但是需要程序员管理,所以在实际开发中使用较少。这里只简单介绍。方便更好的理解GCD和NSOperation。

  • NSThread创建

    //1.创建方式
    NSThread *thread = [[NSThread alloc] initWithTarget:self   selector:@selector(demo:) object:@"Thread"];
    //启动线程
    [thread start];
    //2.创建方式
    [NSThread detachNewThreadSelector:@selector(demo:) toTarget:self withObject:@"Detach"];
    //3.创建方式
    [self performSelectorInBackground:@selector(demo:) withObject:@"background"];
    
  • 常用属性和方法

    //设置线程名字
    @property (nullable, copy) NSString *name
    //阻断
    + (void)sleepForTimeInterval:(NSTimeInterval)ti;
    //终止线程
    + (void)exit;
    //设置优先级
    + (BOOL)setThreadPriority:(double)p;
    
  • 线程间的通讯方法

    //主线程
    - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(nullable id)arg waitUntilDone:(BOOL)wait modes:(nullable NSArray *)array;
    //主线程
    - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(nullable id)arg waitUntilDone:(BOOL)wait;
    //子线程
    - (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(nullable id)arg waitUntilDone:(BOOL)wait modes:(nullable NSArray *)array ;
    //子线程
    - (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(nullable id)arg waitUntilDone:(BOOL)wait 
    //子线程
    - (void)performSelectorInBackground:(SEL)aSelector withObject:(nullable id)arg ;
    
  • 互斥锁
    互斥锁:保证锁内的代码,同一时间只有1个线程执行。
    互斥锁的范围:尽量要小,范围大,效率就会差。
    例子:

    self.tickets = 20;
    NSThread *t1 = [[NSThread alloc]initWithTarget:self selector:@selector(saleTickets) object:nil];
      t1.name = @"售票员B";
      [t1 start];
    
    NSThread *t2 = [[NSThread alloc]initWithTarget:self selector:@selector(saleTickets) object:nil];
      t2.name = @"售票员A";
      [t2 start];
    
    -(void)saleTickets
    {
        while (YES) {
          [NSThread sleepForTimeInterval:1.0];
          //这个地方添加互斥锁,保证买票的代码执行是在同一线程。
          @synchronized (self) {
              if (self.tickets > 0) {
                  self.tickets--;
                  NSLog(@"剩下%d张票 %@",self.tickets,[NSThread currentThread]);
              }else
              {
                  NSLog(@"卖完了");
                  break;
              }
          }    
      }    
    }
    

你可能感兴趣的:(iOS多线程-NSThread)