同步sync 异步async
线程中
同步任务是串行队列,也就是按顺序执行。
同步任务:不会开辟新的线程,它是在当前线程执行的。
dispatch 调度 GCD里面的函数都是以dispatch开头的。
同步任务 步骤:
1.创建一个串行队列 参数:1.队列标签 2.队列属性 DISPATCH_QUEUE_SERIAL它是个宏,是个NULL
dispatch_queue_t queue = dispatch_queue_create("ZPqueue",DISPATCH_QUEUE_SERIAL);
2.同步执行任务 一般只要使用同步执行,串行队列对添加的同步任务,就会马上执行。
dispatch_sync(queue,^{NSLog(@"%@",[NSThread currentThread]);});
异步执行:肯定会开新线程,而且只会开一个线程,所有任务都会在这个新的线程里面执行。
异步任务 步骤:
dispatch_queue_t queue = dispatch_queue_create("ZPasyncQueue",DISPATCH_QUEUE_SERIAL);
2.同步执行任务 一般只要使用同步执行,串行队列对添加的同步任务,就会马上执行。
dispatch_async(queue,^{NSLog(@"%@",[NSThread currentThread]);});
并发队列:会开多个线程,并且它要开多少个线程是我们无法控制的。
dispatch_queue_t queue = dispatch_queue_create("ZPasyncQueue",DISPATCH_QUEUE_CONCURRENT);
2.同步执行任务 一般只要使用同步执行,串行队列对添加的同步任务,就会马上执行。
dispatch_async(queue,^{NSLog(@"%@",[NSThread currentThread]);});
总结:
核心概念:
任务:block
队列:把任务放到队列里面,队列遵循先进先出原则。
串行队列:按顺序执行,当前任务执行完毕才会执行下一个目标任务。
并发队列:同时执行多个任务(可以同时去除多个任务,只要有线程)。
串行队列同步执行:不开线程,在原来的线程里面一个一个的按顺序执行。
串行队列异步执行:开一条线程,在新的线程里面按顺序执行。
并发队列异步执行:开多个线程,并发执行(不一定是一个一个的执行,可能会是多个一起执行)。
并发队列同步执行:不开线程,在原来的线程里面一个一个按顺序执行。
阶段性总结:
1.开不开线程,由执行任务方法决定,同步不开线程,异步肯定开线程。
2.开多少线程,由队列决定,串行最多开一个线程,并发可以开多个线程。具体开多少个由GCD底层决定,程序员不能控制。
**主队列**
// 主队列 :专门负责在主线程上调度任务,不会再子线程调度任务,在主队列不允许开新线程
// 主队列:不允许开新线程
// 异步执行:会开新线程,在新线程执行。
// 结果:不卡线程,只能在主线程上面运行,顺序执行。
步骤:
获得主队列 --- 程序一旦启动至少有一个主线程--->一开始就会创建主队列
-(void)test1{
// 1.获得主队列
dispatch_queue_t queue = dispatch_get_main_queue();
// 2.异步执行任务
for(int i = 0; i < 10; i++)
{
NSLog(@"调度前-----");
// 异步:把任务放到主队列里,但是不需要马上执行。它跟for循环没有关系,test1执行完毕之后他会全部执行完成。
dispatch_async(queue,^{
NSLog(@"%@ %d",[NSThread currnetThread],i);
});
}
NSLog(@"完成---"); // 在这里执行完毕之后会执行主队列的东西。
}
注意:异步执行:异步任务不需要马上执行,只是先把任务放到主队列,等线程有空再去执行,就是等到test1执行结束了,主线程有空闲了就去执行
**同步任务**
-(void)test2{
// 1.获得主队列
dispatch_queue_t queue = dispatch_get_main_queue();
// 2.异步执行任务
for(int i = 0; i < 10; i++)
{
NSLog(@"调度前-----");
// 异步:把任务放到主队列里,但是不需要马上执行。它跟for循环没有关系,test1执行完毕之后他会全部执行完成。
dispatch_sync(queue,^{
NSLog(@"%@ %d",[NSThread currnetThread],i);
});
}
NSLog(@"完成---"); // 在这里执行完毕之后会执行主队列的东西。
}
注意:这个任务是执行不下去的,因为同步任务需要马上执行,但是主线程上面正在执行test2,所以需要等待test2执行完毕之后才能执行同步任务,但是test2在等待这个同步任务执行结束,这样就造成主线程阻塞,产生死锁。谁也没有办法往下执行。
并发队列:
-(void)test3
{
// 例子:有一个小说网站,必须登陆才能下载小说
// 分析:上面是有三个任务---1,用户登录 2,下载小说a 3,下载小说b
// 所以这个小说网站是通过同步执行。
dispatch_queue_t queue = dispatch_queue_create("cz",DISPATCH_QUEUE_CONCURRENT);
dispatch_sync(queue,^{
NSLog(@"用户登录%@",[NSThread currentThread]);
});
}
**全局队列**
/**
全局队列跟并发队列的区别
1.全局队列:没有名称,并发队列有名称
2.全局队列,是供所有的应用程序共享
3.再mrc开发,并发队列创建完成,需要释放;全局队列不需要管理。
*/
-(void)test4
{
// 获取全局队列
// DISPATCH_QUEUE_PRIORITY_HIGH 2 高级优先级 IOS7.0
// DISPATCH_QUEUE_PRIORITY_DEFAULT 0 默认优先级 IOS7.0
// DISPATCH_QUEUE_PRIORITY_LOW (-2) 低优先级 IOS7.0
// DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN 后台优先级 IOS7.0
// IOS8.0 QOS_CLASS_DEFAULT 0 ;
// 参数:1.优先级 (一般写 0 可以适配ios7盒ios8)2.预留参数(也是直接写0)
dispatch_queue_t queue = dispatch_get_global_queue queue(0,0);
// 添加异步任务
dispatch_async(queue,^{
NSLog(@"用户登录%@",[NSThread currentThread]);
});
}
******************************************************************
** * 全局并行队列 * 手动创建串行队列 * 主队列 *
******************************************************************
**同步并行 * 没有开启新线程 * 没有开启新线程 * 死锁 *
* 串行执行任务 * 串行执行任务 *
**异步 * 有开启新线程 * 有开启新线程 * 没有开启新线程 *
* 并行执行任务 * 串行执行任务 * 串行执行任务 *
******************************************************************
队列的选择:
串行队列异步执行
--开一条线程,顺序执行。
--效率不高,执行的比较慢,资源占用小->省电
使用场合:
一般网络连接(3g 4g)对性能要求不会很高
并发队列异步执行
--开启多条线程,并发执行
--效率高,执行快。资源占用大->费电。
使用场合:
-网络wifi 或者需要很快响应,要求用户体验非常流畅。
-对任务执行顺序没有要求
同步任务:一般只会在并发队列,需要阻塞后续任务,必须等待同步任务执行完毕,再去执行其他任务。“依赖”关系。
从子线程回到主线程
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{
// 执行耗时的异步操作。。。。
dispatch_async(dispatch_get_main_queue(),^{
// 回到主线程
});
});
同步sync 异步async的更多相关文章
- 同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式
1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步/异步主要针对C端: 同步: ...
- 同步与异步 & 阻塞与非阻塞
在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 一.同步 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用 ...
- socket阻塞与非阻塞,同步与异步、I/O模型,select与poll、epoll比较
1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步/异步主要针对C端: 同步: 所谓同步,就 ...
- socket阻塞与非阻塞,同步与异步
socket阻塞与非阻塞,同步与异步 作者:huangguisu 转自:http://blog.csdn.net/hguisu/article/details/7453390 1. 概念理解 在进行网 ...
- Python番外之 阻塞非阻塞,同步与异步,i/o模型
1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步/异步主要针对C端: 同步: 所谓同步,就 ...
- 聊聊阻塞与非阻塞、同步与异步、I/O模型
1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步/异步主要针对C端: 同步: 所谓同步,就是在c端 ...
- socket阻塞与非阻塞,同步与异步、I/O模型
socket阻塞与非阻塞,同步与异步 1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式:同步: 所 ...
- 阻塞与非阻塞、同步与异步、I/O模型
1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步/异步主要针对C端: 同步: 所谓同步,就是在c端 ...
- PHP-Socket-阻塞与非阻塞,同步与异步概念的理解
1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式:同步: 所谓同步,就是在发出一个功能调用时,在没 ...
随机推荐
- MVC WebApi 图片上传和显示
1 MVC中显示 内存流 中的图片.(不是图片文件) 创建一个Index用来显示 Action: public ActionResult Index() { return View(); } csht ...
- BZOJ5337 [TJOI2018] 碱基序列 【哈希】【动态规划】
题目分析: 这道题的难点在于要取模,而题面没有写. 容易想到一个O(1E7)的dp.KMP或者哈希得到相关位置然后对于相关位置判断上一个位置有多少种情况. 代码: #include<bits/s ...
- 修改 wordpress 后台管理员登录地址
拷贝根目录下的 wp-login.php文件命名为wp-login.php.backup,把原文件重命名为managewp.phpsed -i "s/wp-login.php/managew ...
- 切割模型固定写死了切平面方程是y=0.1
上一篇讲到3d模型切割我遇到的问题(切面的纹理会混乱),经过这段时间的琢磨,有了解决方案,当然我这里只给出我的解决思路,投入到实际项目中还需要做许多工作,比如我在上一篇中切割模型固定写死了切平面方程是 ...
- 自学Zabbix之路15.2 Zabbix数据库表结构简单解析-Items表
点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 自学Zabbix之路15.2 Zabbix数据库表结构简单解析-Items表 Items表记录了i ...
- 学习Spring Boot:(二十五)使用 Redis 实现数据缓存
前言 由于 Ehcache 存在于单个 java 程序的进程中,无法满足多个程序分布式的情况,需要将多个服务器的缓存集中起来进行管理,需要一个缓存的寄存器,这里使用的是 Redis. 正文 当应用程序 ...
- 【BZOJ2111】[ZJOI2010]排列计数(组合数学)
[BZOJ2111][ZJOI2010]排列计数(组合数学) 题面 BZOJ 洛谷 题解 就是今年九省联考\(D1T2\)的弱化版? 直接递归组合数算就好了. 注意一下模数可以小于\(n\),所以要存 ...
- 对 spi 的认知
在使用 SPI 外设场景下,只需将数据送至 SPI->DR,外设将数据自动发走 在使用 DMA 外设场景下,只需指定数据缓存区地址及 SPI->DR 地址,这样就无需劳驾 CPU 而开始数 ...
- 洛谷 P4151 [WC2011]最大XOR和路径 解题报告
P4151 [WC2011]最大XOR和路径 题意 求无向带权图的最大异或路径 范围 思路还是很厉害的,上午想了好一会儿都不知道怎么做 先随便求出一颗生成树,然后每条返祖边都可以出现一个环,从的路径上 ...
- bracketed-paste-magic:zle:41: not enough arguments for -U
原因是zsh的插件出问题了,解法方法如下: 把 ~/.oh-my-zsh/lib/misc.zsh 文件中的第一段 if 注释掉 OK 啦 # ]]; then # for d in $fpath; ...