iOS多线程基础概念和简单使用

作者: 朝雨晚风 | 来源:发表于2017-10-23 11:50 被阅读100次

    (一)、线程和进程的概念

    进程和线程实际都是一个时间段的描述,是CPU工作时段的描述。
    进程时间段 = CPU加载程序上下文的时间 + CPU执行时间 + CPU保存程序上下文的时间
    (可以简单理解为进程为一个应用程序,但一个应用程序可能创建多个进程,这时候一个进程的结束不代表应用程序运行结束)

    线程时间段 = CPU加载线程上下文的时间 + CPU执行时间 + CPU保存线程上下文的时间
    (是CPU调度和分派的基本单位,是更为细小的时间段,远小于进程时间段)

    (二)、线程的状态与生命周期

    下图是线程状态示意图,从图中可以看出线程的生命周期是:新建 - 就绪 - 运行 - 阻塞 - 死亡


    线程的状态与生命周期.png

    (三)、多线程的四种解决方案

    多线程的四种解决方案分别是:pthread,NSThread,GCD, NSOperation。
    下图是对这四种方案进行了解读和对比。


    多线程的四种解决方案.png

    (四)、GCD和NSOperation的理解与使用

    术语解释.png

    (1)、GCD的特点

    GCD以block为基本单位,一个block中的代码可以为一个任务。GCD以block为基本单位,一个block中的代码可以为一个任务。下文中提到任务,可以理解为执行某个block
    同时,GCD中有两大最重要的概念,分别是“队列”和“执行方式”。
    使用block的过程,概括来说就是把block放进合适的队列,并选择合适的执行方式去执行block的过程。

    2050812-4331a4ac4cebd9d8.png
    • GCD会自动利用更多的CPU内核
    • GCD自动管理线程的生命周期(创建线程,调度任务,销毁线程等)
    • 程序员只需要告诉 GCD 想要如何执行什么任务,不需要编写任何线程管理代码

    (2)、NSOperation简介

    • NSOperation是基于GCD之上的更高一层封装,NSOperation需要配合NSOperationQueue来实现多线程。
      NSOperation实现多线程的步骤如下
      (1)、 创建任务:先将需要执行的操作封装到NSOperation对象中。
      (2)、 创建队列:创建NSOperationQueue。
      (3)、 将任务加入到队列中:将NSOperation对象添加到NSOperationQueue中。

    • 需要注意的是,NSOperation是个抽象类,实际运用时中需要使用它的子类,有三种方式:
      (1)、使用子类NSInvocationOperation
      (2)、使用子类NSBlockOperation
      (3)、定义继承自NSOperation的子类,通过实现内部相应的方法来封装任务。

    NSOperation 和GCD 到底选哪一个?

    1. 从性能上来说:
      GCD是底层的C语言构成的API,更接近底层,而NSOperationQueue基于GCD,使用Objective-C实现的面向对象的线程管理,比GCD更高级抽象。所以GCD在追求性能的底层操作来说,是速度最快的。(单纯从性能速度来说,只有Instruments显示有真正的性能提升时才有必要用低级的GCD。)
    2. 对同一个并行队列中的任务操作来说:
      在NSOperationQueue中,可以随时取消已经设定要准备执行的任务,能够方便地设置依赖关系,能够设置NSOperation的priority优先级,而GCD需要自己写更多的代码来实现。
    3. 从复用度来说:
      能够对NSOperation进行继承,在这之上添加成员变量与成员方法,提高整个代码的复用度,这比简单地将block任务排入执行队列更有自由度,能够在其之上添加更多自定制的功能。

    • NSOperation在线程并发管理、优先级上有着GCD无法比拟的优势。
    • 但是当需求能够以更简单的底层代码完成的时候,GCD或许是个更好的选择,因为GCD主要与block结合使用,代码简洁高效和集中,维护度比较高。

    相关文章

      网友评论

        本文标题:iOS多线程基础概念和简单使用

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