多线程篇-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);
}
}
```
* 结果

  • 第二种

    • 介绍

/*
分离出一条子线程
第一个参数:线程启动调用的方法
第二个参数:目标对象
第三个参数:传递给调用方法的参数
*/
[NSThread detachNewThreadSelector:@selector(run:) toTarget:self withObject:@"我是分离出来的子线程"];
```
* 使用

```objc
 /*
    第二种方式创建
  */
-(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);
        }
}
```
* 结果
- ###`第三种` * 介绍
```objc
 //后台线程
 //第一个参数:线程启动调用的方法
 //第二个参数:传递给调用方法的参数
 //特点:自动启动线程
[self performSelectorInBackground:@selector(run:) withObject:@"我是后台线程"];
```
 * 使用

```objc

/*
第三种方式创建
/
-(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(i2){
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的时候就退出了");
}
```

  • 结果

  • 扩展

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

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

      //设置线程的属性
      //设置线程的名称
      thread.name = @"线程A";
      
      //设置线程的优先级,注意线程优先级的取值范围为0.0~1.0之间,1.0表示线程的优先级最高,如果不设置该值,那么理想状态下默认为0.5
      thread.threadPriority = 1.0;
      
      • thread.name是在一般比较大型的项目中比较常见的设置,因为大型项目中会有走很多线程,然而出现bugthread.name能在短时间内查找

      • thread.threadPriority这个是设置优先级别,但是我建议还是不要去设置它,因为多线程开发:尽量简单点,不要太复杂,影响性能不说,有可能还把自己带晕,不值得,以上纯属个人建议。

                      本章到此结束
              欢迎各位码友随意转载并指正
        
posted @ 2016-01-12 23:41  周大萌的萌  阅读(216)  评论(1编辑  收藏  举报