队列 和 线程 之GCD dispatch
1.dispatch_queue_create 创建队列开启异步线程(1,4,2,3)
// 创建一个队列dispatch_queue_t queue = dispatch_queue_create("my.test.queue", DISPATCH_QUEUE_CONCURRENT);NSLog(@"1111");// 开启一个异步线程dispatch_async(queue, ^{NSLog(@"2222");// 线程等待10秒[NSThread sleepForTimeInterval:5];NSLog(@"3333");});NSLog(@"4444");
2.创建队列开启同步线程(1,2,3,4)
// 创建一个队列dispatch_queue_t queue = dispatch_queue_create("my.test.queue", DISPATCH_QUEUE_CONCURRENT);NSLog(@"1111");// 开启一个同步线程dispatch_sync(queue, ^{NSLog(@"2222");// 线程等待10秒[NSThread sleepForTimeInterval:5];NSLog(@"3333");});NSLog(@"4444");
3.dispatch_get_global_queue 获取全局队列开启异步线程(1,4,2,3)
NSLog(@"1111");// 获取全局队列dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);// 开启一个异步线程dispatch_async(queue, ^{NSLog(@"2222222");[NSThread sleepForTimeInterval:5];NSLog(@"333");});NSLog(@"4444");
4.获取全局队列开启同步线程 (1,2,3,4)
NSLog(@"1111");// 获取全局队列dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);// 开启一个同步线程dispatch_sync(queue, ^{NSLog(@"2222222");[NSThread sleepForTimeInterval:5];NSLog(@"333");});NSLog(@"4444");
5.dispatch_get_main_queue() 获取主线程队列,再开启异步线程(1,4,2,3)
NSLog(@"1111");// 获取主线程队列dispatch_queue_t queue = dispatch_get_main_queue();dispatch_async(queue, ^{NSLog(@"2222");[NSThread sleepForTimeInterval:5];NSLog(@"33333");});NSLog(@"4444");
6.获取主线程队列,再开启同步线程 (1) 。 线程会因为死锁,而永远卡死
NSLog(@"1111");// 获取主线程队列dispatch_queue_t queue = dispatch_get_main_queue();dispatch_sync(queue, ^{NSLog(@"2222");[NSThread sleepForTimeInterval:5];NSLog(@"33333");});NSLog(@"4444");
总结:获取全局队列的名字是默认的,创建队列时可以自己命名队列的名字,其他用法都是一样的。个人认为同步线程意义不大
7.dispatch_get_main_queue() 回到主线程
耗时操作需需要放在异步线程里,UI界面更新必须放在主界面里
[2376:131819] 1111
[2376:131819] 4444
[2376:131860] 2222
[2376:131860] 3333
[2376:131819] 5555
从打印结果来看(1,4,5是在主线程里面,2,3是在异步线程里面)
NSLog(@"1111");// 获取主线程队列dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);dispatch_async(queue, ^{NSLog(@"2222");[NSThread sleepForTimeInterval:5];// 回到主线程dispatch_async(dispatch_get_main_queue(), ^{NSLog(@"5555");});NSLog(@"3333");});NSLog(@"4444");
8.dispatch_apply 执行某个片段N(6)次
dispatch_apply(6, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(size_t index) {NSLog(@"1111");});
9.dispatch_barrier_async 是在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会执行 (2,1,3,4)
dispatch_queue_t queue = dispatch_queue_create("gcdtest.rongfzh.yc", DISPATCH_QUEUE_CONCURRENT);dispatch_async(queue, ^{[NSThread sleepForTimeInterval:3];NSLog(@"111");});dispatch_async(queue, ^{[NSThread sleepForTimeInterval:2];NSLog(@"222");});dispatch_barrier_async(queue, ^{NSLog(@"333_barrier");[NSThread sleepForTimeInterval:4];});dispatch_async(queue, ^{[NSThread sleepForTimeInterval:1];NSLog(@"444");});
10.dispatch_group_async 可以实现监听几组任务是否完成,完成后使用 dispatch_group_notify 执行其他的操作 (1,2,3,4)
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);// 创建一组任务dispatch_group_t group = dispatch_group_create();dispatch_group_async(group, queue, ^{[NSThread sleepForTimeInterval:1];NSLog(@"111");});dispatch_group_async(group, queue, ^{[NSThread sleepForTimeInterval:2];NSLog(@"222");});dispatch_group_async(group, queue, ^{[NSThread sleepForTimeInterval:3];NSLog(@"333");});// 监听所有组的任务完成之后执行,一般是回到主线程刷新UI界面dispatch_group_notify(group, dispatch_get_main_queue(), ^{NSLog(@"444");});
11.dispatch_once 对于某个任务执行一次,且只执行一次。
dispatch_once
函数有两个参数,第一个参数predicate
用来保证执行一次,第二个参数是要执行一次的任务block。
static dispatch_once_t predicate; dispatch_once(&predicate, ^{// some one-time task });
暂时用到这么多,以后再用到会继续补充,也欢迎大家指出遗漏!
转载于:https://www.cnblogs.com/shen5214444887/p/4917343.html
队列 和 线程 之GCD dispatch相关推荐
- Java多线程闲聊(四):阻塞队列与线程池原理
Java多线程闲聊(四)-阻塞队列与线程池原理 前言 复用永远是人们永恒的主题,这能让我们更好地避免重复制造轮子. 说到多线程,果然还是绕不开线程池,那就来聊聊吧. 人们往往相信,世界是存在一些规律的 ...
- 6.1 Tensorflow笔记(基础篇):队列与线程
前言 在Tensorflow的实际应用中,队列与线程是必不可少,主要应用于数据的加载等,不同的情况下使用不同的队列,主线程与其他线程异步进行数据的训练与读取,所以队列与线程的知识也是Tensorflo ...
- java 阻塞锁_Java实现锁、公平锁、读写锁、信号量、阻塞队列、线程池等常用并发工具...
锁的实现 锁的实现其实很简单,主要使用Java中synchronized关键字. public class Lock { private volatile boolean isLocked = fal ...
- 并发队列、线程池、锁
1.CountDownLatch(计数器) CountDownLatch 类位于java.util.concurrent包下,利用它可以实现类似计数器的功能.比如有一个任务A,它要等待其他任 ...
- 【JUC】第五章 JUC 阻塞队列、线程池
第五章 JUC 阻塞队列.线程池 文章目录 第五章 JUC 阻塞队列.线程池 一.阻塞队列 1.简介 2.BlockingQueue 的方法 3.常见的 BlockingQueue 二.线程池 1.简 ...
- 【详解】消息队列和线程关系
1.进程-线程-消息队列 简单的来说,什么是进程?什么是线程?打个比方,你的程序要执行,操作系统就会把你的exe文件加载到内存中,那就生成一个进程了(当然还包含分配到的资源等):对于线程,你可以理解成 ...
- Java队列、线程池及ThreadPoolExecutor自定义线程池实现
目录 1.阻塞队列 2.队列分类 3.API使用 4.线程池 4.1.线程池参数 4.2.线程池实现 4.3.任务执行流程 4.4.拒绝策略 4.5.参数合理值设置 5.自定义线程池流程 6.自定义线 ...
- 线程和并发(三)阻塞队列和线程池
concurrent之atomic相关 概述 java.util.concurrent.atomic原子操作类包里面提供了一组原子变量类.其基本的特性就是在多线程环境下,当有多个线程同时执行这些类的实 ...
- 五、线程管理————GCD
本文只对GCD的其他操作进行一些补充. 1.延迟操作 实例: //延时操作 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)( ...
最新文章
- AWS论剑Azure:安全组之争
- DM8168心得之SD卡快速分区制作
- 美国互联网巨头在华发展10大败因
- CSS 中的内联元素、块级元素以及display的各个属性的特点
- 联想计算机如何设置用户名和密码,联想电脑怎样设密码?联想电脑设置密码方法步骤【图文】...
- PAT乙:1022 D进制的A+B
- 遗传算法MATLAB工具箱的下载与安装
- Vue学习笔记之16-tarbar地开发思路
- dotnet html 桌面开发,用HTML,Vue+element-UI做桌面UI
- selenium+python处理JS弹窗
- LLVM LLD COFF格式分析
- 2022年ps应该选择哪个版本
- 机器学习——决策树(ID3)的实现
- Java8新特性(三) – 流式数据处理
- TSX常见简单用法(入门) Vue3+Vite
- 如何改电脑用户名WIN10/WIN11
- 任意多边形面积的计算
- 检测MSWORD.OLB是否注册及注册的代码
- ingress controller安装总结
- 疯狂Java讲义(五)----第二部分
热门文章
- python异步io多文件_Python 异步 IO 性能又上一层楼
- java冒泡排序_JAVA实现经典排序算法(冒泡排序、选择排序、插入排序、希尔排序、堆排序、归并排序、快速排序)...
- Android课程设计倒计时app,单片机课程设计-可调倒计时器.doc
- sql int 转string_SQL智能代码补全引擎【sql-code-intelligence】介绍
- 中国牡蛎碳酸钙市场需求现状调研及十四五投资风险评估报告2022-2028年版
- android 数字证书具体应用机制
- 跨界巨头谋定现代农业-农民丰收节交易会:全产业链布局
- 基于墨刀的软件界面原型设计——小说搜索阅读软件
- Oracle经典教程学习笔记
- 尝试在centos5下运行phantomjs2