美文网首页程序员
Swift 多线程之GCD基础用法介绍

Swift 多线程之GCD基础用法介绍

作者: KaKaLaaa | 来源:发表于2020-08-14 17:47 被阅读0次

线程?进程?

关于进程和线程的关系和区别网上可以找到很多很好的详解和比喻,在此简单说下二者的含义(在下的拙见)

基础概念

  • \color{red}{程序是指令、数据及其组织形式的描述,进程是程序的实体。}
  • \color{red}{程序本身是没有生命周期的,它只是存在磁盘上的一些指令,程序一旦运行就是进程。}
  • 线程是程序执行流的最小单元,也是指进程内的可执行单元,可调度的实体。
    从某中意义上来说,进程就是一个应用程序在处理机上的一次执行过程,它是一个动态的概念,而线程是进程中的一部分,进程包含一个或多个线程在运行。
  1. 一个线程只能属于一个进程,而一个进程至少有一个线程;
  2. 处理机会给线程,即真正在处理上运行的是线程;
  3. 资源分配给进程,同一进程下的所有线程共享该进程下的所有资源;
  4. 线程在执行过程中,需要协作同步,不同进程的线程要利用消息通信的方法实现同步;
  5. 不仅进程之间可以并发执行,同一进程的多个线程也可以;
  6. 进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源;

参考非常形象的二者概念比喻图文:工厂与工人 —— 进程与线程

GCD消息列队各种执行情况

1、无列队执行

GCD-无队列执行.gif 无队列执行输出结果:可以看到当前是在主线程执行,并且是按顺序依次执行

2、队列的异步和同步执行

  • 异步执行 列队异步执行
  • 同步执行 列队同步执行
    队列的异步和同步执行输出结果:
  • 异步:可以看到结果是无序穿插打印输出的
  • 同步:和主线程的无队列执行顺序结果一样

3、队列的优先级执行

// 队列的优先级执行
func queueWithQos() {
    /**
     Qos: Quality of Service 程序服务质量,用于控制队列执行的优先级
     下面是优先级由低到高
     unspecified
     background
     utility
     default
     userInitiated
     userInteractive
     */
    let queue1 = DispatchQueue(label: "kkk1", qos: .utility)
    let queue2 = DispatchQueue(label: "kkk2", qos: .background)
    queue1.async {
        print("queue1当前线程 >>> \(Thread.current)")
        for i in 0..<10 { print("🐶", i) }
    }
    queue2.async {
        print("queue2当前线程 >>> \(Thread.current)")
        for i in 100..<110 { print("🐳", i) }
    }
    for i in 1000..<1010 { print("🦞", i) }
}
列队优先级执行
列队优先级执行输出结果:🦞是在主线程中执行的,所以优先级是最高的,因为最先执行完成;🐶和🐳各自开启一个异步执行的线程,优先级utility > background,所以🐶会先执行完。它们两个属于不同的队列,故会穿插执行,如果都是一个队列,那么它们就会串行执行。

4、串行队列执行

串行队列执行
串行队列执行输出结果:可以看到在同一线程中执行的代码是依次执行的。

5、并行队列执行

并行队列执行
并行队列执行输出结果:可以看到其和串行队列的区别在于我们设置队列的属性attributes为concurrent,即开启并行队列,输出结果是同时穿插执行的。

6、监听任务的执行是否完成

监听任务的执行

全局队列,使用简单方便(不能滥用)

在上面的众多例子中,我们都是手动去创建队列演示执行过程,实际上,我们并不需要总是自己去手动创建队列,特别是当我们不需要考虑队列的优先级的时候。操作系统会创建一个后台队列的集合,也就是全局队列(global queue)。

let globalQueue1 = DispatchQueue.global()
//    let globalQueue2 = DispatchQueue.global(qos: .utility)
globalQueue1.async {
        // do something
    }

到此基本涵盖介绍了GCD的一点点常规用法,在实际项目工程中要适当适时的使用多线程,便可优化项目性能。Swift的GCD用起来简洁和舒适,使用block的形式进行执行,当然要多多注意造成循环引用、内存泄漏的问题。


部分资料来源于网络,若侵权,请联系删除~
联系方式:kim77895pl@gmail.com
Kim 写于2020.8.14,希望文章能对你有所帮助。

相关文章

  • GCD

    iOS多线程 Swift4 GCD深入解析swift GCD 的一些高级用法GCD 之线程组(Dispatch G...

  • Swift 多线程之GCD基础用法介绍

    线程?进程? 关于进程和线程的关系和区别网上可以找到很多很好的详解和比喻,在此简单说下二者的含义(在下的拙见) 基...

  • Swift 多线程-Thread篇

    1.swift-多线程实现方式(本篇主要介绍Thread) Thread GCD(Grand Central Di...

  • Swift多线程:GCD进阶,单例、信号量、任务组

    Swift多线程:GCD进阶,单例、信号量、任务组 Swift多线程:GCD进阶,单例、信号量、任务组

  • 多线程

    参考文章:iOS多线程--彻底学会多线程之『GCD』Swift 3.0 GCD和DispatchQueue 使用解...

  • iOS多线程之GCD浅析

    本文用来介绍 iOS 多线程中 GCD 的相关知识以及使用方法,分析GCD的原理,总结GCD的用法和需要注意的地方...

  • [Swift]多线程--GCD

    1. 前言 之前写了一遍文章介绍了Objective-C中GCD的用法: [iOS]多线程--GCD, 现在转战到...

  • 多线程之GCD

    线程、多线程 多线程存在的问题 为什么使用多线程? GCD GCD 的 API 介绍Dispatch QueueD...

  • iOS GCD&&多线程

    iOS GCD&&多线程 基础篇 GCD用途 GCD 是 Grand Central Dispatch 的缩写。 ...

  • gcd常见方法整理

    一、基础介绍 基本的gcd操作 多线程编程会产生资源竞争、死锁、内存大量消耗问题,但是我们还是要用多线程,why?...

网友评论

    本文标题:Swift 多线程之GCD基础用法介绍

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