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

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

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

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

pthread示例代码:

- (void)touchesBegan:(NSSet<UITouch *> *)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信息 -->  我是传递给子线程的参数,<NSThread: 0x7ffe1255cb80>{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信息 -->  我是传递给子线程的参数,<NSThread: 0x7ffe1255cb80>{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;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 本文选译自《Threading Programming Guide》。 导语 线程技术作为在单个应用程序中并发执行...
    巧巧的二表哥阅读 2,626评论 4 24
  • 在这篇文章中,我将为你整理一下 iOS 开发中几种多线程方案,以及其使用方法和注意事项。当然也会给出几种多线程的案...
    伯恩的遗产阅读 275,707评论 251 2,328
  • Object C中创建线程的方法是什么?如果在主线程中执行代码,方法是什么?如果想延时执行代码、方法又是什么? 1...
    AlanGe阅读 1,934评论 0 17
  • 廖一梅在《柔软》里说:我们这辈子,遇见爱,遇见性都不稀罕,稀罕的是遇见了解。 她说的是爱情,我要说的是亲情。 周国...
    小琴调阅读 637评论 1 2
  • 问:一项工作任务,我认为领导的工作方法有问题,不如自己的工作方法科学有效,与部分同事沟通后,也认为自己的方法有效。...
    王肖杰阅读 824评论 2 2

友情链接更多精彩内容