pthread,NSThread的使用

iOS中多线程的实现方案:

  1 pthread
        a.特点:
          1)跨平台
          2)使用难度大
        b.使用语言:c语言
        c.使用频率:几乎不用
        d.线程生命周期:由程序员进行管理

    2 NSThread
        a.特点:
            1)面向对象
        b.使用语言:OC语言
        c.使用频率:偶尔使用
        d.线程生命周期:由程序员进行管理

    3 GCD
        a.特点:
            1)充分利用设备的多核
        b.使用语言:C语言
        c.使用频率:经常使用
        d.线程生命周期:自动管理

    4 NSOperation
        a.特点:
            1)基于GCD
            2)比GCD多了一些更简单实用的功能
            3)更加面向对象
        b.使用语言:OC语言
        c.使用频率:经常使用
        d.线程生命周期:自动管理

一、pthread的基本使用

  • pthread的基本使用(需要包含头文件)
    //使用pthread创建线程对象
    pthread_t thread;
    NSString *name = @"wendingding";
    //使用pthread创建线程
    //第一个参数:线程对象地址
    //第二个参数:线程属性
    //第三个参数:指向函数的指针
    //第四个参数:传递给该函数的参数
    pthread_create(&thread, NULL, run, (__bridge void *)(name));

二、NSThread的基本使用

2.1.NSThread线程的创建

  • 第一种创建方式:alloc init
  • 特点:需要手动开启,可以拿到线程对象进行详细设置
    /*
     第一个参数:目标对象
     第二个参数:选择器,线程启动要调用哪个方法
     第三个参数:前面方法要接收的参数(最多只能接收一个参数,没有则传nil)
     */
    NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(run:) object:@"wendingding"];
     //启动线程
    [thread start];
  • 第二种创建线程的方式:分离出一条子线程
  • 特点:自动启动,无法拿到线程对象进行详细设置
    /*
     第一个参数:线程启动调用的方法
     第二个参数:目标对象
     第三个参数:传递给调用方法的参数
     */
    [NSThread detachNewThreadSelector:@selector(run:) toTarget:self withObject:@"我是分离出来的子线程"];
  • 第三种创建线程的方式:后台线程
  • 特点:自动启动,无法进行更详细设置
[self performSelectorInBackground:@selector(run:) withObject:@"我是后台线程"];

2.2.设置线程属性

    //设置线程的名称
    thread.name = @"线程A";
    //设置线程的优先级(线程优先级的取值范围为0.0~1.0之间,1.0表示线程的优先级最高),如果不设置该值,默认为0.5
    thread.threadPriority = 1.0;

2.3.线程的状态(了解)

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

2.4.线程安全

    01 前提:多个线程访问同一块资源会发生数据安全问题
    02 解决方案:加互斥锁
    03 相关代码:@synchronized(self){}
    04 专业术语-线程同步
    05 原子和非原子属性(是否对setter方法加锁)

2.5.线程间通信

-(void)touchesBegan:(nonnull NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event
{
    //开启一条子线程来下载图片
    [NSThread detachNewThreadSelector:@selector(downloadImage) toTarget:self withObject:nil];
}
-(void)downloadImage
{
    // 回到主线程刷新UI
    //4.1 第一种方式
    [self performSelectorOnMainThread:@selector(showImage:) withObject:image waitUntilDone:YES];
    //4.2 第二种方式
    [self.imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:YES];
    //4.3 第三种方式
    [self.imageView performSelector:@selector(setImage:) onThread:[NSThread mainThread] withObject:image waitUntilDone:YES];
}

2.6.如何计算代码段的执行时间

  • 第一种方法
    NSDate *start = [NSDate date];
    // 下载图片数据到本地
    NSData *data = [NSData dataWithContentsOfURL:url];
    NSDate *end = [NSDate date];
    NSLog(@"第二步操作花费的时间为%f",[end timeIntervalSinceDate:start]);
  • 第二种方法
    CFTimeInterval start = CFAbsoluteTimeGetCurrent();
     // 下载图片数据到本地
    NSData *data = [NSData dataWithContentsOfURL:url];
    CFTimeInterval end = CFAbsoluteTimeGetCurrent();
    NSLog(@"第二步操作花费的时间为%f",end - start);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文选译自《Threading Programming Guide》。 导语 线程技术作为在单个应用程序中并发执行...
    巧巧的二表哥阅读 2,465评论 4 24
  • 进程和线程 首先,在了解多线程之前要了解什么是进程,什么是线程 什么是进程呢?进程是指在系统中正在运行的一个应用程...
    搁浅的青蛙阅读 391评论 0 0
  • 创建和启动线程 一个NSThread对象就代表一条线程 创建、启动线程 NSThread *thread = [[...
    JonesCxy阅读 231评论 0 0
  • 昨晚,我和母亲通电话聊了半个多小时。母亲今年七十了,前阵子和朋友去了江西临川的千年古寺,还参观了抚州东乡县的农场。...
    风中红竹Dancer阅读 466评论 12 10
  • 冬梅,冬梅.....普通到不能再普通的名字,如果没有“神”这个姓氏,叫上半个月兴许还不记得叫啥名。 冬梅不仅...
    青青稻田阅读 771评论 4 2