多线程-NSThread-三种实现方式

iOS开发中提供了四中多线程处理方案:pthread、NSThread、GCD和NSOperation

POSIX 表示可移植操作系统接口(Portable Operating System Interface) --pthread

Pthread是一套纯C的通用的多线程API,适用于Unix\Linux\Windows等系统,跨平台,可移植性强,但使用难度比较大,所以使用频率很低,这里不做过多介绍,主要以后三种多线程方案为主

pthread示例代码:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    /*
        参数1:线程的编号(地址)
        参数2:线程的属性
        参数3:要调用的函数
        void*  (*)  (void*)
        int* 指向int类型的指针
        void* 指向void类型的指针 id
     
        参数4:给要调用的函数传递的参数
     */
    
    pthread_t ID;
    int result = pthread_create(&ID, NULL, demo, NULL);
    //返回值为0代表成功,其他为失败
    if (result == 0) {
        NSLog(@"成功");
    }else
    {
        NSLog(@"失败");
    }
}
void* demo (void* param)
{
    NSLog(@"demo %@",[NSThread currentThread]);
    return NULL;
}

@end

接下来,先介绍一下NSThread,对比pthread,NSThread使用更加面向对象,简单易用,可直接操作线程对象,NSThread提供了三种多线程的使用方式:

首先创建一个方法(threadDemo:),在开启的新线程中来执行该方法的内部操作

方式一:

- (void)threadDemoMethod1{
    
    NSString *parameter = @"我是传递给子线程的参数";
    
    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(threadDemo:) object:parameter];
    
    [thread start];
    
}
- (void)threadDemo:(NSString *)parameter{
    
    // LOG信息 -->  我是传递给子线程的参数,{number = 2, name = (null)}
    NSLog(@"%@,%@",parameter,[NSThread currentThread]);
}

方式二:

- (void)threadDemoMethod2{
    
    NSString *parameter = @"我是传递给子线程的参数";
    
    [NSThread detachNewThreadSelector:@selector(threadDemo:) toTarget:self withObject:parameter];
}


- (void)threadDemo:(NSString *)parameter{
    
    // LOG信息 -->  我是传递给子线程的参数,{number = 2, name = (null)}
    NSLog(@"%@,%@",parameter,[NSThread currentThread]);
}

方式三:

- (void)viewDidLoad {
    [super viewDidLoad];

//    [self threadDemoMethod1];
//    [self threadDemoMethod2];
    [self performSelectorInBackground:@selector(threadDemo:) withObject:@"方式三"];
    
}

方式一相对于后两种方式可以获得一个NSThread对象
通过线程对象可以直接对线程的状态进行操作

线程的状态:

  • 新建状态
  • 就绪状态
  • 运行状态
  • 阻塞状态
  • 死亡状态

NSThread的API中为我们提供了部分操作线程的方法

// 开启线程  --> 将线程添加到可调度线程池  变为就绪状态
- (void)start NS_AVAILABLE(10_5, 2_0);

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

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

你可能感兴趣的:(多线程-NSThread-三种实现方式)