多线程篇-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);
            }
    }
    • 结果
      731729-20160114222908632-1662383483.png
  • 第二种

    • 介绍
    /*
    分离出一条子线程
    第一个参数:线程启动调用的方法
    第二个参数:目标对象
    第三个参数:传递给调用方法的参数
    */
    [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);
            }
    }
    • 结果
      731729-20160114223016288-1464898443.png
  • 第三种

    • 介绍
     //后台线程
     //第一个参数:线程启动调用的方法
     //第二个参数:传递给调用方法的参数
     //特点:自动启动线程
    [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);
            }
    }
    • 结果
      731729-20160114223133460-120827200.png

      线程的状态
  • 介绍
    objc //线程的各种状态:新建-就绪-运行-阻塞-死亡 //常用的控制线程状态的方法 [NSThread exit];//退出当前线程 [NSThread sleepForTimeInterval:2.0];//阻塞线程 [NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:2.0]];//阻塞线程 //注意:线程死了不能复生

  • 使用
    objc /* 状态 */ -(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的时候就退出了"); }
  • 结果
    731729-20160114223207007-279231515.png

  • 扩展

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

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

                      本章到此结束
              欢迎各位码友随意转载并指正

转载于:https://www.cnblogs.com/ljy-666/p/5125818.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值