美文网首页
iOS 多线程(一)多线程概览

iOS 多线程(一)多线程概览

作者: shuaikun | 来源:发表于2020-12-04 10:16 被阅读0次
    多线程.png
    思维导图地址:https://pan.wps.cn/l/shFszm5WVHDh?f=130

    一、线程进程的基本概念

    1、进程

      可以理解成一个运行中的应用程序,是系统进行资源分配和调度的基本单位,是操作系统结构的基础,主要管理资源。

    2、线程:

      (1)操作系统能够进行运算调度的最小单位,一个进程对应多个线程。
      (2)线程被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
      (3)线程是独立调度和分派的基本单位。同一进程中的多条线程将共享该进程中的全部系统资源,但是自有调用堆栈和寄存器环境。

    3、主线程:

      (1)处理UI,所有更新UI的操作都必须在主线程上执行。
      (2)用于创建其他的子线程,
      (3)不要把耗时操作放在主线程,会卡界面。
      (4)通常它必须在最后完成执行(比如各种关闭操作)。

    4、多线程:

      在同一时刻,一个CPU只能处理1条线程,但CPU可以在多条线程之间快速的切换,只要切换的足够快,就造成了多线程一同执行的假象。

    5、线程进程形象举例

      线程就像火车的一节车厢,进程则是火车。车厢(线程)离开火车(进程)是无法跑动的,而火车(进程)至少有一节车厢(主线程)。多线程可以看做多个车厢,它的出现是为了提高效率。

    6、队列:

      队列指执行任务的等待队列,即用来存放任务的队列,它是一种特殊的线性表,采用 FIFO(先进先出)的原则,即新任务总是被插入到队列的末尾,而读取任务的时候总是从队列的头部开始读取。
      (1)串行队列:多个任务顺序执行
      (2)并行队列:多个任务同时执行(根据最大线程数最多同时执行几个任务)

    7、任务:

      任务(task)用于指代抽象的概念,表示需要执行工作,具体可以是一个函数或者一个block。

    8、目的和意义:

      多线程是通过提高资源使用率来提高系统总体的效率,将耗时的操作放在后台执行!。

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

    image.jpeg

    下面分别阐述线程生命周期中的每一步

    1、新建:

      实例化线程对象

    2、就绪:

      向线程对象发送start消息,线程对象被加入可调度线程池等待CPU调度。

    3、运行:

      CPU 负责调度可调度线程池中线程的执行。线程执行完成之前,状态可能会在就绪和运行之间来回切换。就绪和运行之间的状态变化由CPU负责,程序员不能干预。

    4、阻塞:

      当满足某个预定条件时,可以使用休眠或锁,阻塞线程执行。sleepForTimeInterval(休眠指定时长),sleepUntilDate(休眠到指定日期),@synchronized(self):(互斥锁)。

    5、死亡:

      正常死亡,线程执行完毕。非正常死亡,当满足某个条件后,在线程内部中止执行/在主线程中止线程对象

    6、[NSThread exit] 强行终止:

      一旦强行终止线程,后续的所有代码都不会被执行。

    7、[thread cancel] 取消:

      并不会直接取消线程,只是给线程对象添加 isCancelled 标记。

    三、多线程的四种解决方案:pthread,NSThread,GCD,NSOperation

    下图是对这四种方案进行了解读和对比。

    方案 简介 底层语言 线程生命周期 优点 缺点
    pthread 1、一套通用的多线程api
    2、适用于Unix/Linux/Windows等系统
    3、跨平台\可移植
    4、使用难度大
    C语言 程序员管理
    NSThread 1、使用更加面向对象
    2、简单易懂,可直接操作线程对象
    OC 程序员管理 轻量级最低,相对简单 需要手动管理所有的线程活动(生命周期,休眠,同步等)线程同步对数据的加锁会有一定的系统开销
    Cocoa NSOperation 1、基于GCD(底层是GCD)
    2、比GCD多了一些简单实用的功能
    3、使用更加面向对象
    C语言 程序员管理 自带线程周期管理,可只关注自己处理逻辑 NSOperation是面向对象的抽象类,实现只能是其子类(NSInvocationOperation和NSBlockOperation),对象需要添加到NSOperationQueue队列里执行
    GCD 1、旨在替换NSThread等线程技术
    2、充分利用设备的多核
    C语言 程序员管理 效率高,可避免并发陷阱 基于C而非OC实现

    如果对性能效率要求较高,处理大量并发时用GCD,简单而安全的可用NSOPeration或者NSThread。Apple推荐使用GCD

    四、关于线程安全问题

    五、NSThread的使用

    六、GCD的理解与使用

    七、NSOperation的理解与使用

    相关文章

      网友评论

          本文标题:iOS 多线程(一)多线程概览

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