美文网首页
对于多线程的一些理解

对于多线程的一些理解

作者: 小吖朱 | 来源:发表于2017-02-05 10:04 被阅读0次

    1.PThread : 是一个C语言的一个API接口,由于使用难度较大,较为底层。我们在平常开发的时候不经常使用!
    2.NSThread: 是三种方法里面相对轻量级的,但需要管理线程的生命周期、同步、加锁问题,这会导致一定的性能开销
    3.NSOperation: 是基于OC实现的,NSOperation以面向对象的方式封装了需要执行的操作,不必关心线程管理、同步等问题。NSOperation是一个抽象基类,iOS提供了两种默认实现:NSInvocationOperation和NSBlockOperation,当然也可以自定义NSOperation
    4.GCD:提供了一些新特性、运行库来支持多核并行编程,它的关注点更高:如何在多个cpu上提升效率

    下面主要介绍一些NSThread:

    首先NSThread初始化方法:(动态方法)
    ``
    1 - (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument;

    ``
    参数解析:
    selector :线程执行的方法,这个selector最多只能接收一个参数

    target :selector消息发送的对象

    argument : 传给selector的唯一参数,也可以是nil
    2初始化方法(静态方法)
    2 + (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)argument;
    3 [NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil]; // 调用完毕后,会马上创建并开启新线程

    1. 隐式创建线程的方法
      ``
      4 [self performSelectorInBackground:@selector(run) withObject:nil];

    ``

    获取当前线程
    5 NSThread *current = [NSThread currentThread];

    获取主线程
    6 NSThread *main = [NSThread mainThread];

    暂停线程
    // 暂停2s [NSThread sleepForTimeInterval:2]; // 或者 NSDate *date = [NSDate dateWithTimeInterval:2 sinceDate:[NSDate date]]; [NSThread sleepUntilDate:date];

    线程间的通信

    1. 在指定线程上执行操作
      [self performSelector:@selector(run) onThread:thread withObject:nil waitUntilDone:YES];
    2. 在主线程上进行操作
      [self performSelectorOnMainThread:@selector(run) withObject:nil waitUntilDone:YES];
    3. 在当前线程执行操作
      7 [self performSelector:@selector(run) withObject:nil];

    优缺点
    1.优点:NSThread比其他两种多线程方案较轻量级,更直观地控制线程对象
    2.缺点:需要自己管理线程的生命周期,线程同步。线程同步对数据的加锁会有一定的系统开销

    补充一点就是:NSThread有哪几种状态,和转换的逻辑

    新建->就绪-> cup调度当前任务->运行->阻塞->死亡->CUP调度其他任务->就绪
    主线程的一些概念:
    默认启动的线程,也叫作UI线程,用来显示和刷新UI界面,和处理一些UI事件的。 需要注意的是:不要把耗时操作放到主线程上去做!UI操作必须在主线程中执行 !!!!

    说一说如何解决多条线程访问同一块资源造成的线程安全的问题,以及一些注意点!

    加同步(互斥)锁 @synchronized OC中的同步锁:(锁对象) + {要锁住的代码} 锁对象:要求是全局唯一的属性 注意点: 要注意加锁的位置 加锁需要耗费性能,因此需要注意加锁的条件(多线程访问同一块资源) 专业术语:线程同步

    原子和非原子属性的区别

    atomic:原子属性,会为setter方法默认加锁,线程是安全的,但是会消耗大量资源! noatomic:非原子属性,不会为setter方法加锁。非线程安全,适合内存小的移动设备。

    相关文章

      网友评论

          本文标题:对于多线程的一些理解

          本文链接:https://www.haomeiwen.com/subject/naosittx.html