iOS进阶之多线程

作者: 一个默默无闻的程序猿 | 来源:发表于2018-04-02 10:43 被阅读25次

    写在前面

    在平时的公司项目开发过程中,虽然几乎用不到多线程,但是对于了解某些三方实现原理、加深对多线程概念的理解 甚至是日后项目的优化,有必要对多线程做一次系统的总结。


    基础概念

    1. 进程:是指在系统中正在运行的程序。每一个进程之间都是独立的,均运行在其专用且受保护的内存空间
    2. 线程:一个进程想要执行任务,必须得有线程(每一个进程至少有一条线程)。一个进程(程序)的所有任务都在线程中执行。
    3. 线程的串行:一个线程中的任务是串行执行的,在同一时间内,一个线程只能执行一个任务。
    4. 多线程:一个进程中可以开启多条线程,每条线程可以并行(同时)执行不同任务。
    5. 多线程的原理:同一时间内,CPU只能处理一条线程(多核除外),多线程并发(同时)执行,其实是CPU快速地在多条线程之间调度。
      多线程优缺点:
      优点:能适当提高程序的执行效率、提高资源的利用率。
      缺点:创建线程是有开销的,iOS下主要成本包括:内核数据结构(大约1KB)、栈空间(子线程512KB、主线程1MB,也可以使用-setStackSize设置,但必须是4K的倍数,而且最小是16K),创建线程大约需要90毫秒的创建时间。
      开启越多性能越低。
    6. 多线程在iOS开发中的应用:
      主线程:一个iOS程序在运行后,默认会开启一条线程,称为“主线程”活“UI线程”
      主线程的主要作用:显示、刷新UI界面,处理UI事件
    7. iOS中多线程的实现方案:
      pthread:一套通用的多线程API(C语言),适用于Unix\Linux\Windows系统,跨平台\可移植,使用难度大,线程生命周期:程序管理员
      NSThread:使用更加面向对象,简单易用,直接操作线程对象(OC语言)
      GCD:旨在替代NSThread等线程技术,不是多线程技术,充分利用设备的多核(C语言),中枢调度系统,自动管理
      NSOperation:基于GCD(底层是GCD),比GCD多了一些更简单使用的功能,使用更加面向对象(OC语言)

    在面试中经常会提到多线程技术,其实严格意义上来讲,iOS中接触到的多线程技术只有pthread和NSThread,只有这两种技术需要程序员直接操作线程。而GCD和NSOperation属于调度系统,GCD是苹果基于多线程技术为多核系统提供的解决方案,NSOperation则是苹果大力推荐的“并发”技术。GCD在iOS4.0出现;而NSOperation是iOS2.0就有了,在iOS4.0重写。

    GCD 和 NSOperation的区别主要表现在以下几方面:

    1)GCD是一套 C 语言API,执行和操作简单高效,因此NSOperation底层也通过GCD实现,这是他们之间最本质的区别.因此如果希望自定义任务,建议使用NSOperation;

    2)依赖关系,NSOperation可以设置操作之间的依赖(可以跨队列设置),GCD无法设置依赖关系,不过可以通过同步来实现这种效果;

    3)KVO(键值对观察),NSOperation容易判断操作当前的状态(是否执行,是否取消等),对此GCD无法通过KVO进行判断;

    4)优先级,NSOperation可以设置自身的优先级,但是优先级高的不一定先执行,GCD只能设置队列的优先级,如果要区分block任务的优先级,需要很复杂的代码才能实现;

    1. 继承,NSOperation是一个抽象类.实际开发中常用的是它的两个子类:NSInvocationOperation和NSBlockOperation,同样我们可以自定义NSOperation,GCD执行任务可以自由组装,没有继承那么高的代码复用度;

    6)效率,直接使用GCD效率确实会更高效,NSOperation会多一点开销,但是通过NSOperation可以获得依赖,优先级,继承,键值对观察这些优势,相对于多的那么一点开销确实很划算,鱼和熊掌不可得兼,取舍在于开发者自己;

    7)可以随时取消准备执行的任务(已经在执行的不能取消),GCD没法停止已经加入queue 的 block(虽然也能实现,但是需要很复杂的代码)

    8)GCD提供了一些NSOperation不具备的功能,比如:一次性执行、延时执行、调度组;而NSOperation也同样提供了一些GCD实现起来比较麻烦的功能:最大并发数、队列的暂停和继续、取消所有操作、指定操作之间的依赖关系(GCD通过同步来实现)等。

    基于GCD简单高效,更强的执行能力,操作不太复杂的时候,优先选用GCD;而比较复杂的任务可以自己通过NSOperation实现.


    写在后面

    后面会将iOS中多线程的实现方案详细整理,包括pthread的简单使用NSThread详解GCDNSOperation

    相关文章

      网友评论

        本文标题:iOS进阶之多线程

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