多线程 -- NSThread

NSThread

  • NSThread

    • 一个NSThread对象就代表一条线程
  • 创建线程的几种方式

  • alloc/init
    // 1.创建线程
    NJThread *thread = [[NJThread alloc] initWithTarget:self selector:@selector(demo:) object:@"lnj"];
    // 设置线程名称
    [thread setName:@"xmg"];
    // 设置线程的优先级
    // 优先级仅仅说明被CPU调用的可能性更大
    [thread setThreadPriority:1.0];
    // 2.启动线程
    [thread start];
  • 线程的相关用法
+ (NSThread *)mainThread; // 获得主线程
- (BOOL)isMainThread; // 是否为主线程
//获得当前线程
NSThread *current = [NSThread currentThread];

//线程的名字
- (void)setName:(NSString *)n;
- (NSString *)name;
  • 其他创建线程的方式
    • 优点:简单快捷
    • 缺点:无法对线程进行更详细的设置
// 1.创建线程
[NSThread detachNewThreadSelector:@selector(demo:) toTarget:self withObject:@"lnj"];


// 1.创建线程
// 注意: Swift中不能使用, 苹果认为这个方法不安全
 [self performSelectorInBackground:@selector(demo:) withObject:@"lnj"];
  • 线程状态

启动线程
- (void)start;
// 进入就绪状态 -> 运行状态。当线程任务执行完毕,自动进入死亡状态

阻塞(暂停)线程
+ (void)sleepUntilDate:(NSDate *)date;
+ (void)sleepForTimeInterval:(NSTimeInterval)ti;
// 进入阻塞状态

强制停止线程
+ (void)exit;
// 进入死亡状态

注意:一旦线程停止(死亡)了,就不能再次开启任务

  • 多线程的安全隐患

    • 当多个线程访问同一块资源时,很容易引发数据错乱和数据安全问题
  • 线程锁

    • 被锁定的代码同一时刻只能有一个线程执行
@synchronized(锁对象) { // 需要锁定的代码  }
  • 互斥锁的优缺点 优点:能有效防止因多线程抢夺资源造成的数据安全问题 缺点:需要消耗大量的CPU资源

  • 互斥锁注意点

    • 锁定1份代码只用1把锁,用多把锁是无效的
    • 锁定范围越大, 性能越差

  • 原子和非原子属性

    • atomic:线程安全,需要消耗大量的资源
    • nonatomic:非线程安全,适合内存小的移动设备
  • 自旋锁 & 互斥锁

    • 共同点 都能够保证同一时间,只有一条线程执行锁定范围的代码
    • 不同点
      • 互斥锁:如果发现有其他线程正在执行锁定的代码,线程会进入"休眠"状态,等待其他线程执行完毕,打开锁之后,线程会被"唤醒"
      • 自旋锁:如果发现有其他线程正在执行锁定的代码,线程会"一直等待"锁定代码执行完成! 自旋锁更适合执行非常短的代码!

  • 线程间通信
    • 子线程做耗时操作, 主线程更新数据
[self performSelectorInBackground:@selector(download) withObject:nil];

    /*
     waitUntilDone是否等待被调用方法执行完成,有可能也会等待调用方法的执行完成!
     YES: 等待被调用线程执行完毕再执行后面的代码
     NO : 不用等待被调用线程执行完毕就可以执行后面的代码
     */
[self performSelectorOnMainThread:@selector(showImage:) withObject:[UIImage imageWithData:data] waitUntilDone:YES];

 

posted @ 2015-08-17 22:22  Apolla  阅读(179)  评论(0编辑  收藏  举报