iOS多线程篇-NSThread简单使用

  • 创建的三种方式

    • 第一种

      • 介绍
       alloc init 创建
       第一个参数:目标对象
       第二个参数:选择器,线程启动要调用哪个方法
       第三个参数:前面方法要接收的参数(最多只能接收一个参数,没有则传nil)
       NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(run:) object:@"子线程"];
      
      • 使用
      /**
       * 第一种方式创建
       */
      -(void)threadCreate1{
          NSLog(@"主线程-------%@",[NSThread currentThread]);
          //创建线程
          NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(run:) object:@"子线程"];
          //开始执行线程
          [thread start];
          NSLog(@"主线程-------%@",[NSThread currentThread]);
      }
          /**
          *  线程执行方法
           *
           */
          -(void)run:(id)obj{
          for (int i=0; i<3; i++) {
              NSLog(@"%@----%@",[NSThread currentThread],obj);
          }
      }
      
      • 结果


        iOS多线程篇-NSThread简单使用_第1张图片
    • 第二种

      • 介绍
      /*
      分离出一条子线程
      第一个参数:线程启动调用的方法
      第二个参数:目标对象
      第三个参数:传递给调用方法的参数
      */
      [NSThread detachNewThreadSelector:@selector(run:) toTarget:self withObject:@"我是分离出来的子线程"];
      
      • 使用
      /**
      *  第二种方式创建
      */
      -(void)threadCreate2{
          NSLog(@"主线程-------%@",[NSThread currentThread]);
          //detachNewThreadSelector   会理解在后台执行selector方法
          [NSThread detachNewThreadSelector:@selector(run:) toTarget:self withObject:@"我是分离出来的子线程"];
          NSLog(@"主线程-------%@",[NSThread currentThread]);
      }
      /**
      *  线程执行方法
      *
      */
      -(void)run:(id)obj{
          for (int i=0; i<3; i++) {
              NSLog(@"%@----%@",[NSThread currentThread],obj);
          }
      }
      
      • 结果


    • 第三种

    • 介绍

      后台线程
       //第一个参数:线程启动调用的方法
       //第二个参数:传递给调用方法的参数
      //特点:自动启动线程
      [self performSelectorInBackground:@selector(run:) withObject:@"我是后台线程"];
      
    • 使用

      /**
      *第三种方式创建
      */
      -(void)threadCreate3{
      NSLog(@"主线程-------%@",[NSThread currentThread]);
      //是NSObject分类的一个方法,意味着所有继承于NSObject的类都是用用此方法,并且在其他线程执行方法!
      //只要设定,那么它会立即在后台执行 selector   方法
      [self performSelectorInBackground:@selector(run:) withObject:@"后台线程"];
      NSLog(@"主线程-------%@",[NSThread currentThread]);
      }
      /**
      *线程执行方法
      *
      */
      -(void)run:(id)obj{
        for (int i=0; i<3; i++) {
          NSLog(@"%@----%@",[NSThread currentThread],obj);
        }
      }
      
    • 结果


  • 线程的状态

    • 介绍
      //线程的各种状态:新建-就绪-运行-阻塞-死亡
      //常用的控制线程状态的方法
      [NSThread exit];//退出当前线程
      [NSThread sleepForTimeInterval:2.0];//阻塞线程
      [NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:2.0]];//阻塞线程
      //注意:线程死了不能复生
    
    • 使用
    /**
    *  状态
    */
    -(void)threadState{
        NSLog(@"睡2 秒");
        //为类方法,直接让线程睡眠两秒
        [NSThread sleepForTimeInterval:2.0];
        //分离出一个子线程
        [NSThread detachNewThreadSelector:@selector(run:) toTarget:self withObject:nil];
    }
    /**
    *  线程执行方法
    *
    */
    -(void)run:(id)obj{
    for (int i=0; i<8; i++) {
        if(i==2){
            NSLog(@"睡5秒");
            //[NSDate dateWithTimeIntervalSinceNow:5.0]  从现在开始过了5秒
            //睡到指定的日期,
            [NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:5.0]];
        }
        NSLog(@"%@----%d",[NSThread currentThread],i);
        //当线程满足一定的条件,可以强行停止
        if (i==5) {
            //退出
            [NSThread exit];
        }
      }
    NSLog(@"这里是不能来的,因为在5的时候就退出了");
    }
    
    • 结果


      iOS多线程篇-NSThread简单使用_第2张图片
    • 扩展

    一定不能在主线程执行 [NSThread exit] 如果一旦执行了那么程序则会终止掉

  • 写到这才发现,忘记介绍线程中常用属性

    //设置线程的属性
    //设置线程的名称
    thread.name = @"线程A";
    
    //设置线程的优先级,注意线程优先级的取值范围为0.0~1.0之间,1.0表示线程的优先级最高,如果不设置该值,那么理想状态下默认为0.5
    thread.threadPriority = 1.0;
    
    • thread.name是在一般比较大型的项目中比较常见的设置,因为大型项目中会有走很多线程,然而出现bug,thread.name能在短时间内查找
    • thread.threadPriority这个是设置优先级别,但是我建议还是不要去设置它,因为多线程开发:尽量简单点,不要太复杂,影响性能不说,有可能还把自己带晕,不值得,以上纯属个人建议。
                    本章到此结束
            欢迎各位码友随意转载并指正

你可能感兴趣的:(iOS多线程篇-NSThread简单使用)