五、线程管理————GCD
本文只对GCD的其他操作进行一些补充。
1、延迟操作
实例:
//延时操作
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
});
/*
dispatch_after的参数
参数1 dispatch_time_t when
多少纳秒之后执行
参数2 dispatch_queue_t queue
任务添加到那个队列
参数3 dispatch_block_t block
要执行的任务
*/
2、一次性执行
(1)定义:程序运行中只执行一次。一次性执行是线程安全的,可以使用一次性执行创建单例对象,效率比互斥锁高。
(2)实现:可以用来创建单例对象。
//原理:当onceToken为0时执行方法,然后将全局变量oneceToken更改为-1,以后就无法再执行。
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
//要执行一次的代码;
});
3、调度组
(1)定义:有时候需要在多个异步任务都执行完成之后继续做某些事情,比如下载歌曲,等所有的歌曲都下载完毕之后转到主线程提示用户,这样需要一个顺序的统一调度。
(2)实现:
//1 全局队列
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
//2 调度组
dispatch_group_t group = dispatch_group_create();
//3 添加任务
//把任务添加到队列,等任务执行完成之后通知调度组,任务是异步执行
dispatch_group_async(group, queue, ^{
NSLog(@"歌曲1下载完毕 %@",[NSThread currentThread]);
});
dispatch_group_async(group, queue, ^{
NSLog(@"歌曲2下载完毕 %@",[NSThread currentThread]);
});
dispatch_group_async(group, queue, ^{
NSLog(@"歌曲3下载完毕 %@",[NSThread currentThread]);
});
//4 所有任务都执行完成后,获得通知 (异步执行)
//等调度组中队列的任务完成后,把block添加到指定的队列
dispatch_group_notify(group, queue, ^{
NSLog(@“所有歌曲都已经下载完毕! %@",[NSThread currentThread]);
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
//在主线程,更新UI控件,提示用户
NSLog(@“播放器更新完毕! %@",[NSThread currentThread]);
});
NSLog(@"over");
(3)原理:
//1 全局队列
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
//2 调度组
dispatch_group_t group = dispatch_group_create();
//ARC中不用写
// dispatch_retain(group);
//3 进入调度组,执行此函数后,再添加的异步执行的block都会被group监听
dispatch_group_enter(group);
//4 添加任务一
dispatch_async(queue, ^{
NSLog(@“下载第一首歌曲!”);
dispatch_group_leave(group);
//ARC中此行不用写,也不能写
// dispatch_release(group);
});
//5 添加任务二
dispatch_group_enter(group);
dispatch_async(queue, ^{
NSLog(@“下载第二首歌曲”);
dispatch_group_leave(group);
//ARC中此行不用写,也不能写
//dispatch_release(group);
});
//6 获得调度组的通知
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@“歌曲都已经下载完毕! %@",[NSThread currentThread]);
});
//7 等待调度组 监听的队列中的所有任务全部执行完毕,才会执行后续代码,会阻塞线程(很少使用)
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
转载于:https://www.cnblogs.com/David-SU/p/5274386.html
五、线程管理————GCD相关推荐
- 聊一聊Flutter Engine线程管理与Dart Isolate机制
阿里妹导读:Flutter是一款开源的移动跨平台UI开发套件,它不仅与现存的Native代码兼容,还能帮你用Dart语言快速开发高质量的跨平台App. 本文由闲鱼技术团队福居撰写,结合Flutter ...
- api windows 线程加锁_Windows 进程与线程管理
第六章 进程与线程管理 本章我们把注意力集中到Windows 的进程.线程与作业对象上.正如我们在前面的章节中所述的,Windows的设计以基于对象的思想作为基础.在本章的第一节中,主要介绍进程与线程 ...
- c语言中的线程管理,深入解析C++编程中线程池的使用
为什么需要线程池目前的大多数网络服务器,包括Web服务器.Email服务器以及数据库服务器等都具有一个共同点,就是单位时间内必须处理数目巨大的连接请求,但处理时间却相对较短. 传 统多线程方案中我们采 ...
- RTThread 线程管理
线程是实现任务的载体,它是 RT-Thread 中最基本的调度单位,它描述了一个任务执行的运行环境,也描述了这个任务所处的优先等级,重要的任务可设置相对较高的优先级,非重要的任务可以设置较低的优先级, ...
- 操作系统实验4——内核线程管理
操作系统实验4--内核线程管理 一. 实验目的 二. 实验内容 三. 实验准备 1. proc_struct结构: 2. 进程与线程 四. 实验步骤 (一) 练习0:填写已有实验 (二) 练习1:分配 ...
- RT-Thread 线程管理(学习笔记)
本文参考自[野火EmbedFire]<RT-Thread内核实现与应用开发实战--基于STM32>,仅作为个人学习笔记.更详细的内容和步骤请查看原文(可到野火资料下载中心下载) 文章目录 ...
- RT-Thread线程管理以及内核裁剪
RT-Thread线程管理以及内核裁剪 文章目录 RT-Thread线程管理以及内核裁剪 1. RTOS概述 1.1 RTOS的定义 1.2 主流RTOS 2. RT-Thread架构 3. RT-T ...
- java 线程的创建和执行_线程管理(一)线程的创建和运行
声明:本文是< Java 7 Concurrency Cookbook>的第一章, 作者: Javier Fernández González 译者:郑玉婷 校对:欧振聪 线程的创建和运行 ...
- Unix进程和线程管理及其异同
Unix进程和线程管理及其异同 一,进程 1,什么是进程 在最初的单处理器系统中,系统中的多道程序按照一定规则切换而实现多任务处理,后来发现多个程序并发导致系统资源被共享,为了描述和管理程序对共享资源 ...
最新文章
- tensorflow 2
- 双十一:你收到了多少商家短信
- Make Games with Python Pygame (2)
- 【新版上线】网易云点播内容加密服务正式发布啦!
- mysql 删除重复数据_MySQL查找和删除重复数据
- bs架构的系统能连接mysql吗_HTTP、BS架构
- 设备上的介质簇的结构不正确_环保设备选型参考系列——生化系统之潜水搅拌机【价格】...
- TortoiseSVN and TortoiseGit 版本控制图标不见了
- java用1234组成_java编程题,java1234组成三位数不重复
- C#集合练习题(链表LinkedListT)
- Word如何使用预设样式、自定样式以及生成自动目录教程
- 【JavaWeb】消息摘要、数字签名与数字证书的区别
- 9个方法,教你用Google Drive做好云端档案管理
- python中keys的用法_在Python中用keys()方法返回字典键的教程
- 专科学历事业单位工资计算机,【事业单位工资标准表】 事业单位学历工资标准...
- 测试一个教室和一个椅子
- 聊聊storm的WindowedBolt
- 数据结构之冒泡排序算法(图解+分析+代码调优)
- 电脑c盘满了怎么清理,快速清理,用这5招
- IP地址划分(子网划分)及是否同一网段计算
热门文章
- 基于HTML5技术的电力3D监控应用(三)
- DotLucene源码浅读笔记(1) : Lucene.Net.Analysis
- 一个阿里云 MYSQL 服务 RDS 下的查询优化
- struts2通过基于XML的配置实现校验没有提示信息
- minSdkVersion = targetSdkVersion = compileSdkVersion
- C++实现有序表折半查找
- EditText 输入类型 android:inputType=quot;参数类型quot;
- Map集合HashMap TreeMap的输出方法
- Mysql常用的命令
- 电商网站全链路压测实战