• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
那一季&花开
博客园    首页    新随笔    联系   管理    订阅  订阅

多线程



  • 多线程

  • 简介 
  • iOS多线程 

NSThread

  • 解决线程阻塞问题 
  • 多线程并发 
  • 线程状态 
  • 扩展-NSObject分类扩展 

NSOperation

  • NSInvocationOperation 
  • NSBlockOperation 
  • 线程执行顺序 

GCD

  • 串行队列 
  • 并发队列 
  • 其他任务执行方法 

线程同步

  • NSLock同步锁 
  • @synchronized代码块 
  • 扩展--使用GCD解决资源抢占问题 
  • 扩展--控制线程通信  

 

 

 总结:

 

 1>无论使用哪种方法进行多线程开发,每个线程启动后并不一定立即执行相应的操作,具体什么时候由系统调度(CPU空闲时就会执行)。

 

 2>更新UI应该在主线程(UI线程)中进行,并且推荐使用同步调用,常用的方法如下:

 

 - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait (或者-(void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL) wait;方法传递主线程[NSThread mainThread])

 [NSOperationQueue mainQueue] addOperationWithBlock:

 dispatch_sync(dispatch_get_main_queue(), ^{})

 3>NSThread适合轻量级多线程开发,控制线程顺序比较难,同时线程总数无法控制(每次创建并不能重用之前的线程,只能创建一个新的线程)。

 

 4>对于简单的多线程开发建议使用NSObject的扩展方法完成,而不必使用NSThread。

 

 5>可以使用NSThread的currentThread方法取得当前线程,使用 sleepForTimeInterval:方法让当前线程休眠。

 

 6>NSOperation进行多线程开发可以控制线程总数及线程依赖关系。

 

 7>创建一个NSOperation不应该直接调用start方法(如果直接start则会在主线程中调用)而是应该放到NSOperationQueue中启动。

 

 8>相比NSInvocationOperation推荐使用NSBlockOperation,代码简单,同时由于闭包性使它没有传参问题。

 

 9>NSOperation是对GCD面向对象的ObjC封装,但是相比GCD基于C语言开发,效率却更高,建议如果任务之间有依赖关系或者想要监听任务完成状态的情况下优先选择NSOperation否则使用GCD。

 

 10>在GCD中串行队列中的任务被安排到一个单一线程执行(不是主线程),可以方便地控制执行顺序;并发队列在多个线程中执行(前提是使用异步方法),顺序控制相对复杂,但是更高效。

 

 11>在GDC中一个操作是多线程执行还是单线程执行取决于当前队列类型和执行方法,只有队列类型为并行队列并且使用异步方法执行时才能在多个线程中执行(如果是并行队列使用同步方法调用则会在主线程中执行)。

 

 12>相比使用NSLock,@synchronized更加简单,推荐使用后者。

 

posted @ 2016-01-18 16:59  那一季&花开  阅读(143)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3