• 多线程 -- 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];
    本博文由博主根据资料或其他优秀博文整理而成,转载请注明出处,谢谢!
  • 相关阅读:
    Python内置函数(14)——delattr
    Python内置函数(13)——complex
    Python内置函数(12)——compile
    Python内置函数(11)——classmethod
    Python内置函数(10)——chr
    Python内置函数(9)——callable
    Python内置函数(8)——bytes
    Python内置函数(7)——bytearray
    Python内置函数(6)——bool
    Python内置函数(4)——ascii
  • 原文地址:https://www.cnblogs.com/Apolla/p/4737984.html
Copyright © 2020-2023  润新知