iOS线程(小白入门版)

news/2024/7/20 22:46:46 标签: ios, 线程, swift, 线程队列任务

1.任务、线程、队列

每一个要执行的操作都是任务:比如说函数

一个队列中可以放很多个线程,一个线程中有很多个任务

可以这样看:有一个办事所(队列),所里有很多窗口(线程),每一个想办事的人(任务)都要在窗口办。

2.队列种类:串行队列、并行队列、系统主队列、系统全局并发队列

可以手动创建的队列:

( 1 )串行队列:系统为串行队列一般只分配一个线程,串行队列中执行任务的线程不允许被当前队列中的任务阻塞(此时会死锁),但可以被别的队列任务阻塞。

let queue = DispatchQueue(label: "com.xxx.xxx.queueName")

( 2 )并行队列:系统会为并行队列至少分配一个线程线程允许被任何队列的任务阻塞。

let queue = DispatchQueue(label: "com.xxx.xxx.queueName", attributes: .concurrent)

系统自动帮我们创建的6 条队列:1 条系统主队列(串行),5 条全局并发队列(不同优先级),它们是我们创建的所有队列的最终目标队列,这 6 个队列负责所有队列的线程调度。

( 3 )系统主队列:是一个串行队列,它主要处理 UI 相关任务,也可以处理其他类型任务。

let mainQueue = DispatchQueue.main

( 4 )全局并发队列:存在 5 个不同的 QoS 级别。

let globalQueue = DispatchQueue.global(qos: .background) // 后台运行级别

3.任务种类:同步任务、异步任务

1)同步任务:直接在当前线程中插入任务,执行完插入的任务后 ,线程才能执行原任务(会阻塞当前线程)。

queue.sync {



}

2)异步任务:队列会安排另一个线程去执行这一任务(不会阻塞当前线程)。

queue.async {



}

总结:

  • 队列一共有四种:串行队列、并行队列、系统主队列、系统全局并发队列
  • 串行队列只有一条线程,并且线程中按序执行任务
  • 并行队列中可以有很多线程,并且执行任务顺序不分先后
  • 同步任务会阻塞当前线程,并在当前线程立刻执行
  • 异步任务不会阻塞当前线程,并在与当前线程不同的线程执行
  • 如何避免线程死锁:不要在串行和主队列中执行同步任务。

更多深入了解:

iOS Swift GCD 开发教程 - 掘金


http://www.niftyadmin.cn/n/5196532.html

相关文章

基于 FFmpeg 的跨平台视频播放器简明教程(十一):一种简易播放器的架构介绍

系列文章目录 基于 FFmpeg 的跨平台视频播放器简明教程(一):FFMPEG Conan 环境集成基于 FFmpeg 的跨平台视频播放器简明教程(二):基础知识和解封装(demux)基于 FFmpeg 的跨平台视频…

【c#】使用Prometheus监控Windows系统

Prometheus 监控Windows机器 1.Prometheus 简单介绍 Prometheus 是一个开源的系统监控和报警工具包,最初建立在 SoundCloud 之上。自 2012 年成立以来,许多公司和组织都采用了 Prometheus,它拥有非常活跃的开发者和用户社区。现在是一个独立的开源项目,独立于任何…

11/19总结

Redis的五种基本数据类型 1.String (字符串) String是Redis中最常用的一种数据类型,也是Redis中最简单的一种数据类型。 表面上它是字符串,但其实他可以灵活的表示字符串、整数、浮点数3种值。 Redis会自动的识别这3种值。 2.List (列表) lpush&…

同一台Linux同时安装MYSQL5.7和MYSQL8(第二篇)

MYSQL8安装步骤 1、上传安装包 mysql-8.0.27-linux-glibc2.12-x86_64.tar.xz 2、解押 mysql-8.0.27-linux-glibc2.12-x86_64.tar.xz 并修改名称 [rootzonghe21 data]# tar -zxvf mysql-8.0.27-linux-glibc2.12-x86_64.tar.xz [rootzonghe21 data]# mv -zxvf mysql-8.0.27-linu…

C 动态分配内存

C 动态分配内存 在本教程中,您将学习使用标准库函数:malloc,calloc,free和realloc在C语言程序中动态分配内存。 如您所知,数组是固定数量的值的集合。声明数组的大小后,您将无法更改它。 有时&#xff0…

JS数组转为字符串如何实现?

在开发中,若需要将数组转换为字符串,可以利用数组对象的join()和toString()方法实现。 toString() toString()方法会把数组转换为字符串,逗号分隔每一项。 join() join(‘分隔符’)会将数组的所有元素用指定的分隔符链接成为一个字符串。…

光谱融合——Deep Spatio-spectral Attention Convolutional Neural Networks

Hyperspectral Image Super-Resolution via Deep Spatiospectral Attention Convolutional Neural Networks 简介 论文链接 对于高分辨率多光谱(高分辨率意味空间信息更好)图像,采用spatial attention机制进行空间信息的保留,对…

【鸿蒙最新全套教程】<HarmonyOS第一课>1、运行Hello World

下载与安装DevEco Studio 在HarmonyOS应用开发学习之前,需要进行一些准备工作,首先需要完成开发工具DevEco Studio的下载与安装以及环境配置。 进入DevEco Studio下载官网,单击“立即下载”进入下载页面。 DevEco Studio提供了Windows版本和…