黑马程序员技术交流社区

标题: iOS多线程知识总结 [打印本页]

作者: 阿泽泽    时间: 2016-5-14 00:31
标题: iOS多线程知识总结
1. iOS中苹果提供4钟方案来帮助我们实现多线程:

  (1) 纯C语言的pthread,偏底层,需要程序员手动管理线程的生命周期,基本不用。

  (2) OC语言的NSTread,需要手动管理线程生命周期,偶尔调试用来获取当前线程[NSTread currentTread/mainTread];

  (3) 纯C语言的GCD(Grand Central Dispatch伟大的中枢调度器),自动管理线程生命周期,完全隐藏了Tread字眼,面向任务和队列,有同步和异步函数,自动决定开启的线程数量,自动管理线程的生死,虽然是C语言的,但是经常使用。

  (4) OC语言的NSOperation,底层封装了GCD,自动管理线程生命周期,比GCD多了一些功能,因为是OC的,更加面向对象,经常使用。

2. GCD相关总结:

  2.1 在iOS中同时开线程最好不要超过5条,GCD也是这么操作的。可以在主线程利用GCD开启10条线程,然后在block中打印每条线程,发现主队列中最多5条线程同一时间执行。GCD会根据当前设备CPU的内核数(单核、双核、四核)自动决定开启线程数的多少。

  2.2 GCD屏蔽了线程,程序员无需关注dispath什么时候开启线程,什么时候执行任务,什么时候关闭线程。GCD面向任务和队列,使用GCD函数时只需要告诉它任务(写在block中)和队列名(queue)这两个参数,GCD会自动将任务加入到该队列中,然后按照队列的先进先出FIFO原则,取出任务,开启线程,在线程中完成任务。GCD只是在线程中默默地把任务做完,做完了它不会反馈任何提示信息。

  2.3 常用的2个最简单的GCD函数:

  dispatch_sync(dispatch_queue_t queue, ^(void)block); //sync同步,只能在当前线程(通常是主线程/UI线程)中并发/串行执行queue中的任务block,不能开启新的线程来执行队列中的任务。

  dispatch_async(dispatch_queue_t queue, ^(void)block); //async异步,能够开启多条线程(一般最多5条)并发/串行的执行queue中的block任务。
  2.4 关于串行和并发:

  这两个概念是针对queue队列来说的,在每个线程中都会有一个主队列,也可以自己新建多条队列,在使用dispatch函数时,传入的参数为queue名和block,那么该block就会被加入该queue中等待执行。串行队列是指一次只能取出queue中的一个任务执行,前面的没执行完,后面的就不可能被执行。而并发队列是一次可以取出queue中的多个任务,开多条线程同时执行。后面的任务可能和前面的任务同时被执行完成。并发队列只能在异步GCD函数dispatch_async中执行。

  2.5 易混淆的术语:

  同步/异步针对GCD函数而言,主要影响能不能开启多条线程;串行和并发针对队列queue而言,主要影响任务的执行方法。

  同步:GCD函数只能在当前线程执行,不能开启新线程 。

  异步:GCD函数可以开启多条线程执行queue中的任务。

  串行:queue中一次只能取出一个任务,执行完了才能执行下一个。

  并发:queue中可以一次取出多个任务,在多条线程中同时执行。

  2.6 GCD最常见的用法:全局并发队列异步执行任务

  GCD会自动帮我们创建一个整个程序都能访问的全局并发队列,我们在程序的任何地方获取它(),然后利用GCD异步函数dispatch_async将任务添加其中,有GCD自动在后台开启线程并发执行




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2