iOS 多线程之NSthread详解

本人做开发有五年多了,自己在平时开发中总结了不少的东西,以及通用功能,平实比较喜欢写代码,很少有写博客,今天我就来和大家总结下iOS中的多线程,首先来说一下多线程中的NSthread

什么是线程
进程是指在系统中运行的程序,每个程序都是运行在独立的内存空间下,每个程序必定有一个或者多个任务要执行,而任务就必须要线程去去执行,每个进程至少有一个以上的线程,线程是进程的最基本单位。

为什么要用多线程开发
优点:
1.一个 CPU 在同一时间时候谁能处理一条线程,采用多线程可以适当的提高程序的运行效率,充分提高CPU 利用率
2.可以适当的提高运行速度,提高产品的用户体验。
3.多任务时,可以设定任务的优先级
4.多线程可以同时(相对的)处理多个数据
缺点:
1.开启一个需要占用一定的内存空间
2.对CPU的要求更多额外的开销
3.程序设计代码开发相对更加复杂
4.容易造成线程死锁(多线程同时共享同一数据时)

iOS 中线程对比 

名称 简介 优点 缺点 使用频率
pthread C语言写的一套多线程API 基于C语言,跨平台 生命周期都要程序员去处理,C语言面向过程,代码相对复杂,不易维护 使用很少
NSThread OC 对象语言 面向对象,简单易用 生命周期都要程序员去处理 使用比较少
GCD 基于C语言封装的多线程API GCD更接近底层,性能更好,速度是最快的,自动管理生命周期 GCD需要自己写更多的代码来实现,结合block来写,代码更简洁 常用
NSoperation 底层基于GCD写的多线程API 代码比GCD更简洁,更多了一些简单实用的功能,实用面向对象,自动管理生命周期 相对于GCD,GCD 的并发能力更高一点 常用

NSthread 代码实现

  • 方法1
 //1.创建子线程 (线程自动执行)
[self performSelectorInBackground:@selector(NSthreadRun:) withObject:@" 后台"];
  • 方法2
 //1.创建子线程 (线程自动执行)
[NSThread detachNewThreadSelector:@selector(NSthreadRun:) toTarget:self withObject:@"哈哈"];
  • 方法3
 //1.实例华对象 需要调用start才能执行
    NSThread *thread=[[NSThread alloc]initWithTarget:self selector:@selector(NSthreadRun:) object:@""];
    //2.设置线程名称
    thread.name=@"thread 1";
    //3.调度优先级的取值范围是0.0 ~ 1.0,默认0.5,值越大,优先级越高
    thread.threadPriority=0.1;
    //4.启动线程 在新开的形成执行run 方法
    [thread start];
    //5.获取当前线程
    NSThread *current = [NSThread currentThread];
    //6.获取主要线程
    NSThread *main = [NSThread mainThread];
    //7.程休眠 单位毫秒
    [NSThread sleepForTimeInterval:20];
    //8.退出线程
    [NSThread exit];

多线程的安全隐患问题

  • 加锁(对象同一时间只能由一个线程操作)
    nonatomic 非原子属性
    atomic 原子属性–默认属性
    原子属性就是针对多线程设计的。 原子属性实现 单(线程)写 多(线程)读
    “atomic(原子属性)在set方法内部加了一把自旋锁”
    “nonatomic(非原子属性)下,set和get方法都不会加锁”

  • 设置对象属性原子性(不可 拆分)
    加锁

  @synchronized(obj) {
    //处理线程任务
      NSLog(@"%d-------%@",i,[NSThread currentThread]);   
     }

原子性

@synthesize obj = _obj;

- (NSObject *)obj {
    return _obj;
}

- (void)setObj:(NSObject *)obj {
    @synchronized(self) {
        _obj = obj;
    }
}

猜你喜欢

转载自blog.csdn.net/lovetltt/article/details/50982832