iOS中的多线程(关于GCD 基本概念)

699 阅读2分钟

「这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战

GCD简介

什么是GCD

全称Grand Central Dispatch,它是C语言的API

GCD优势

  • CGD是苹果公司为多核的并行运算提供的方案(iOS4开始)
  • GCD会自动利用更多的CPU内核
  • GCD会自动管理线程生命周期(创建线程、调度线程、销毁线程),程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理的代码

GCD 任务和队列( queue:队列 block:任务)

GCD 任务

任务:执行操作,也就是在线程中执行的那段代码。在 GCD 中是放在 block 中的。执行任务有两种方式:同步执行 和 异步执行

  • 同步执行

    同步添加任务到指定的队列中,在添加的任务执行结束之前,会一直等待,直到队列里面的任务完成之后,才会继续执行接下来的其他逻辑

    dispatch_sync(dispatch_queue_t  _Nonnull queue, <^(void)block>)
    
  • 异步执行

    异步添加任务到指定的队列中,它不会等待任务执行结束,只要将任务加入队列,就可以继续执行接下来的其他逻辑

    dispatch_async(dispatch_queue_t  _Nonnull queue, <^(void)block>)
    
  • 同步和异步的区别

    • 同步:只能在当前线程中执行任务,不具备开启新线程的能力
    • 异步:可以在新的线程中执行任务,具备开启新线程的能力

GCD 队列

队列:用来存放任务的队列。队列是一种特殊的线性表,采用 FIFO(先进先出)的原则,即新任务总是被插入到队列的末尾,而读取任务的时候总是从队列的头部开始读取。每读取一个任务,则从队列中释放一个任务。GCD 有两种队列:串行队列 和 并发队列

  • 并发队列:可以开启多个线程,并且让多个任务同时执行。并发功能只有在异步 dispatch_async 方法下才有效

    Snip20211107_61.png

  • 串行队列:只开启一个线程,任务一个接着一个执行

    Snip20211107_60.png

注:
有四个容易混淆的概念:同步异步并发串行

  • 同步异步 主要影响能不能开线程
  • 串行并行 主要影响任务的执行方式

GCD使用

  • 创建一个队列(串行队列或并发队列)
  • 将任务追加到任务的等待队列中,然后系统就会根据任务类型执行任务(同步执行或异步执行)