队列 和 线程 之GCD dispatch
1.dispatch_queue_create 创建队列开启异步线程(1,4,2,3)
// 创建一个队列
dispatch_queue_t queue = dispatch_queue_create("my.test.queue", DISPATCH_QUEUE_CONCURRENT);
NSLog(@"");
// 开启一个异步线程
dispatch_async(queue, ^{
NSLog(@"");
// 线程等待10秒
[NSThread sleepForTimeInterval:];
NSLog(@"");
}); NSLog(@"");
2.创建队列开启同步线程(1,2,3,4)
// 创建一个队列
dispatch_queue_t queue = dispatch_queue_create("my.test.queue", DISPATCH_QUEUE_CONCURRENT);
NSLog(@"");
// 开启一个同步线程
dispatch_sync(queue, ^{
NSLog(@"");
// 线程等待10秒
[NSThread sleepForTimeInterval:];
NSLog(@"");
}); NSLog(@"");
3.dispatch_get_global_queue 获取全局队列开启异步线程(1,4,2,3)
NSLog(@"");
// 获取全局队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, );
// 开启一个异步线程
dispatch_async(queue, ^{
NSLog(@"");
[NSThread sleepForTimeInterval:];
NSLog(@"");
});
NSLog(@"");
4.获取全局队列开启同步线程 (1,2,3,4)
NSLog(@"");
// 获取全局队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, );
// 开启一个同步线程
dispatch_sync(queue, ^{
NSLog(@"");
[NSThread sleepForTimeInterval:];
NSLog(@"");
});
NSLog(@"");
5.dispatch_get_main_queue() 获取主线程队列,再开启异步线程(1,4,2,3)
NSLog(@"");
// 获取主线程队列
dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_async(queue, ^{
NSLog(@"");
[NSThread sleepForTimeInterval:];
NSLog(@"");
});
NSLog(@"");
6.获取主线程队列,再开启同步线程 (1) 。 线程会因为死锁,而永远卡死
NSLog(@"");
// 获取主线程队列
dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_sync(queue, ^{
NSLog(@"");
[NSThread sleepForTimeInterval:];
NSLog(@"");
});
NSLog(@"");
总结:获取全局队列的名字是默认的,创建队列时可以自己命名队列的名字,其他用法都是一样的。个人认为同步线程意义不大
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(@"");
// 获取主线程队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, );
dispatch_async(queue, ^{
NSLog(@"");
[NSThread sleepForTimeInterval:];
// 回到主线程
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"");
});
NSLog(@"");
});
NSLog(@"");
8.dispatch_apply 执行某个片段N(6)次
dispatch_apply(, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, ), ^(size_t index) {
NSLog(@"");
});
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:];
NSLog(@"");
});
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:];
NSLog(@"");
});
dispatch_barrier_async(queue, ^{
NSLog(@"333_barrier");
[NSThread sleepForTimeInterval:];
});
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:];
NSLog(@"");
});
10.dispatch_group_async 可以实现监听几组任务是否完成,完成后使用 dispatch_group_notify 执行其他的操作 (1,2,3,4)
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, );
// 创建一组任务
dispatch_group_t group = dispatch_group_create(); dispatch_group_async(group, queue, ^{
[NSThread sleepForTimeInterval:];
NSLog(@"");
});
dispatch_group_async(group, queue, ^{
[NSThread sleepForTimeInterval:];
NSLog(@"");
});
dispatch_group_async(group, queue, ^{
[NSThread sleepForTimeInterval:];
NSLog(@"");
});
// 监听所有组的任务完成之后执行,一般是回到主线程刷新UI界面
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"");
});
11.dispatch_once 对于某个任务执行一次,且只执行一次。
dispatch_once
函数有两个参数,第一个参数predicate
用来保证执行一次,第二个参数是要执行一次的任务block。
static dispatch_once_t predicate;
dispatch_once(&predicate, ^{
// some one-time task
});
暂时用到这么多,以后再用到会继续补充,也欢迎大家指出遗漏!
队列 和 线程 之GCD dispatch的更多相关文章
- iOS 并行编程:GCD Dispatch Sources
1 简介 dispatch source是一种用于处理事件的数据类型,这些被处理的事件为操作系统中的底层级别.Grand Central Dispatch(GCD)支持如下的dispatch sour ...
- 拆开Ceph看队列和线程
作者:吴香伟 发表于 2017/01/08 版权声明:可以任意转载,转载时务必以超链接形式标明文章原始出处和作者信息以及版权声明 我上小学时家离学校很远,家在某某山脚,学校在镇里.每周回家一趟,周五放 ...
- Android系统--输入系统(十七)Dispatcher线程_分发dispatch
Android系统--输入系统(十七)Dispatcher线程_分发dispatch 1. 回顾 InputRead线程从输入设备当中得到输入事件 对于读到输入事件稍作处理,比如紧急事件,来电时候按下 ...
- 10.9 android输入系统_APP跟输入系统建立联系和Dispatcher线程_分发dispatch
12. 输入系统_APP跟输入系统建立联系_InputChannel和Connection核心: socketpair // 第9课第3节_输入系统_必备Linux编程知识_任意进程双向通信(scok ...
- 自定义ThreadPoolExecutor带Queue缓冲队列的线程池 + JMeter模拟并发下单请求
.原文:https://blog.csdn.net/u011677147/article/details/80271174 拓展: https://github.com/jwpttcg66/GameT ...
- python队列、线程、进程、协程
目录: 一.queue 二.线程 基本使用 线程锁 自定义线程池 生产者消费者模型(队列) 三.进程 基本使用 进程锁 进程数据共享 默认数据不共享 queues array Manager.dict ...
- 6、TensorFlow基础(四)队列和线程
队列和线程 和 TensorFlow 中的其他组件一样,队列(queue)本身也是图中的一个节点,是一种有状态的节点,其他节点,如入队节点(enqueue)和出队节点(dequeue),可以修改它的内 ...
- python队列、线程、进程、协程(转)
原文地址: http://www.cnblogs.com/wangqiaomei/p/5682669.html 一.queue 二.线程 #基本使用 #线程锁 #自定义线程池 #生产者消费者模型(队列 ...
- 【Java并发】并发队列与线程池
并发队列 阻塞队列与非阻塞队 ConcurrentLinkedQueue BlockingQueue ArrayBlockingQueue LinkedBlockingQueue PriorityBl ...
随机推荐
- 几道关于springboot、springCloud的面试题。
什么是springboot 用来简化spring应用的初始搭建以及开发过程 使用特定的方式来进行配置(propertites或yml文件) 创建独立的spring引用程序main方法运行 嵌入的tom ...
- 【x】 PAT/BasicLevel_C++/1002. 写出这个数 (20).cpp
C++中的to_string()函数[C++11支持] - Bravo Yeung-羊较瘦之自留地 - CSDN博客https://blog.csdn.net/lzuacm/article/detai ...
- [PHP]Nginx与PHP的文件上传大小限制
---------------------------------------------------------------------------------------------------- ...
- Java复习 之流
在Java程序中 对于数据的输入/输出操作以“流”方式进行:提供了各种各样的流类,用以获取各种不同的种类的数据,程序中通过标准的方法输入或输出数据 Inputstream 例子1: 但是中文会乱码 应 ...
- 利用等概率Rand5产生等概率Rand3(转)
问题本身很明确,但不知道起个什么题目好,姑且先这么说吧. 问题描述:现在有一个叫做Rand5的函数,可以生成等概率的[0, 5)范围内的随机整数,要求利用此函数写一个Rand3函数(除此之外,不能再使 ...
- ETL工具总结
ETL的考虑 做 数据仓库系统,ETL是关键的一环.说大了,ETL是数据整合解决方案,说小了,就是倒数据的工具.回忆一下工作这么些年来,处理数据迁移.转换的工作倒 还真的不少.但是那些工 ...
- padding-bottom图片自适应
今天学了慕课网的去哪了视频轮播图的图片自适应是这么做的htm,cssl如下:为什么padding-bottom 取值62.08% 呢,因为图片的高为465px,宽为749px. 465/749 既为6 ...
- jquery 滚动条位置的
$('#fixedHead').width()//div的宽度 $('#fixedHead')[0].scrollWidth//滚动条的宽度 两者的差为滚动条的宽度 var b1=$("#d ...
- Eclipse git 冲突合并
Eclipse有一个git的插件叫EGit,用于实现本地代码和远程代码对比.合并以及提交.但是在本地代码和远程代码有冲突的时候,EGit的处理方案还是有点复杂.今天就彻底把这些步骤给理清楚,并公开让一 ...
- kangle请求控制添加的add_header怎么查看
请求控制里添加的add header不会显示在浏览器的请求里,因为是发送给源的,你们要查看可以用phinfo查看.回应控制里添加的会显示在浏览器的回应里