HTML5技术

iOS多线程之NSThread使用 - 华过的痕迹

字号+ 作者:H5之家 来源:H5之家 2015-12-08 09:52 我要评论( )

iOS中的多线程技术 我们在iOS开发项目过程中,为了解决UI界面操作不被耗时操作阻塞,我们会使用到多线程技术。在iOS开发中,我们主要会用到三种多线程操作技术:NSThread,NSOperation,GCD。 1.Thread:是三种方法里面相对轻量级的,但需要管理线程的生命周期

iOS中的多线程技术

  我们在iOS开发项目过程中,为了解决UI界面操作不被耗时操作阻塞,我们会使用到多线程技术。在iOS开发中,我们主要会用到三种多线程操作技术:NSThread,NSOperation,GCD。

1.Thread :是三种方法里面相对轻量级的,但需要管理线程的生命周期、同步、加锁问题,这会导致一定的性能开销
2.Cocoa Operations:是基于OC实现的,NSOperation以面向对象的方式封装了需要执行的操作,不必关心线程管理、同步等问题。NSOperation是一个抽象基类,iOS提供了两种默认实现:NSInvocationOperation和NSBlockOperation,当然也可以自定义NSOperation
3.Grand Central Dispatch(简称GCD,iOS4才开始支持):提供了一些新特性、运行库来支持多核并行编程,它的关注点更高:如何在多个cpu上提升效率

这篇文章主要将第一种多线程操作技术NSThread。

线程分类

1主线程  UI线程,显示、刷新UI界面,处理UI控件的事件

2子线程  后台线程,异步线程

注意点:不要把耗时的操作放在主线程,要放在子线程中执行,因为主线程包含用户界面的操作,因此减少主线程执行耗时操作,重要的原因是为了避免挑战用户耐心。

NSThread常用操作

  • 创建和启动线程
  • NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil]; [thread start]; // 线程一启动,就会在线程thread中执行self的run方法

  • 主线程相关方法
  • + (NSThread *)mainThread; // 获得主线程 - (BOOL)isMainThread; // 是否为主线程 + (BOOL)isMainThread; // 是否为主线程

  • 获得当前线程
  • NSThread *current = [NSThread currentThread];

  • 线程的调度优先级
  • + (double)threadPriority; + (BOOL)setThreadPriority:(double)p; - (double)threadPriority; - (BOOL)setThreadPriority:(double)p;

    调度优先级的取值范围是0.0 ~ 1.0,默认0.5,值越大,优先级越高

     

  • 线程的名字
  • - (void)setName:(NSString *)n; - (NSString *)name;

  • 创建线程后自动启动线程
  • [NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];

  • 隐式创建并启动线程
  • [self performSelectorInBackground:@selector(run) withObject:nil]; 

      上述2种创建线程方式的优缺点

  • 优点:简单快捷
  • 缺点:无法对线程进行更详细的设置
  • 线程的状态

  • 程序中的线程可能的状态演变
  •     如下图,展示线程的在不同时期的状态

     

      2.线程状态的控制方法

  • 启动线程
  • - (void)start; // 进入就绪状态 -> 运行状态。当线程任务执行完毕,自动进入死亡状态

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

  • 强制停止线程
  • + (void)exit; // 进入死亡状态

    注意:一旦线程停止(死亡)了,就不能再次开启任务

     

    多线程的安全隐患

  • 资源共享
  • 如下图所示的线程安全隐患分析:

     

      为了解决如图所示的问题,我们可以使用NSThread中的互斥锁技术,如下图所示:

    安全隐患解决 – 互斥锁

  • 互斥锁使用格式
  • @synchronized(锁对象) { // 需要锁定的代码 }

    注意:锁定1份代码只用1把锁,用多把锁是无效的

     

  • 互斥锁的优缺点
  •     优点:能有效防止因多线程抢夺资源造成的数据安全问题

     

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    相关文章
    • 【Vue 入门】使用 Vue2 开发一个展示项目列表的应用 - zhangjk

      【Vue 入门】使用 Vue2 开发一个展示项目列表的应用 - zhangjk

      2017-04-30 16:00

    • 对于Bootstrap的介绍以及如何使用 - novai-L

      对于Bootstrap的介绍以及如何使用 - novai-L

      2017-04-29 09:00

    • 在Delphi下使用迅雷APlayer组件进行免注册开发 - Delphi力量

      在Delphi下使用迅雷APlayer组件进行免注册开发 - Delphi力量

      2017-04-28 15:00

    • 探索 vuex 2.0 以及使用 vuejs 2.0 + vuex 2.0 构建记事本应用 - nzbin

      探索 vuex 2.0 以及使用 vuejs 2.0 + vuex 2.0 构建记事本应用 - nzb

      2017-04-25 09:02

    网友点评
    (