GCD同步异步 串行并行大解析
/**
核心概念
任务:block里需要执行的操作
队列:把任务添加进入队列中,按照先进先出的原则来执行任务
串行队列:一个一个的执行
并行队列:可以让多个任务并发(同时)执行(自动开启多个线程同时执行任务)并发功能只有在异步(dispatch_async)函数下才有效。
同步任务:不会开辟新的线程,任务在当前的线程中执行,同时任务是立刻执行
异步任务:会开辟新的线程(主队列不可以),任务在新开辟的线程执行(主队列在主线程中执行),不是立刻 执行任务
同步任务串行队列:不会开启新的线程,当前的线程中顺序执行任务
同步任务并行队列:不会开启新的线程,当前的线程中执行任务,立刻执行任务
异步任务串行队列:会开辟一个新的线程,在新开辟的线程中执行任务,不是立刻执行
异步任务并行队列:会开辟新的线程,在新开辟的线程中执行任务,任务的完成顺序是无序的,不是立刻执行
主队列(特殊的串行队列):任务只会在主线程中调度,不会开辟新的线程(一般用于刷新UI)
异步任务主队列:不会开辟新的线程,当前的线程中执行任务,不会立刻执行任务
同步任务主队列:死锁
全局队列(并行队列):全局队列供给应用程序共享,可以设置优先级
开辟新的线程:由任务决定,同步任务不会开辟新的线程,异步任务会开辟新的线程(主队列不会开辟新的线程)
开辟多少线程:由队列决定,串行队列只会开启一个线程,并行队列会开辟多个线程,具体多少个由任务的数量和GCD的底层来决定的
*/
//串行队列:一个一个执行
//同步操作:不开启新的线程
//执行结果:不开启新的线程,一个一个顺序执行
- (void)gcdTest1 {
//label:队列名
//attr:队列属性(串行,并发)
//DISPATCH_QUEUE_SERIAL 串行
//DISPATCH_QUEUE_CONCURRENT 并发
//#define DISPATCH_QUEUE_SERIAL NULL
dispatch_queue_t queue = dispatch_queue_create("com.bjsxt",DISPATCH_QUEUE_SERIAL);
NSLog(@"开始");
//同步操作
//操作任务:block
dispatch_sync(queue, ^{
//打印当前线程
NSLog(@"%@",[NSThread currentThread]);
});
NSLog(@"结束");
}
//串行队列:一个一个执行
//异步操作:会开启新的线程
//执行结果:开启一个新的线程,在新开辟的线程中执行任务,不是立刻执行
- (void)gcdTest2 {
dispatch_queue_t queue = dispatch_queue_create("com.bjsxt", NULL);
NSLog(@"开始");
for (NSInteger i = 0 ; i < 10; i ++ ) {
//异步请求
dispatch_async(queue, ^{
NSLog(@"%@,%@",[NSThread currentThread],@(i));
});
}
NSLog(@"结束");
}
//并发队列:多个线程同时执行
//异步操作:会开启新的线程
//执行结果:会开辟新的线程,在新开辟的线程中执行任务,任务的完成顺序是无序的,不是立刻执行
- (void)gcdTest3 {
//开启并发队列
dispatch_queue_t queue = dispatch_queue_create("com.bjsxt", DISPATCH_QUEUE_CONCURRENT);
NSLog(@"开始");
for (NSInteger i = 0 ; i < 10; i ++ ) {
//执行异步操作
dispatch_async(queue, ^{
NSLog(@"%@",[NSThread currentThread]);
});
}
NSLog(@"结束");
}
//并发队列:多个线程同时执行
//同步操作:不会开启新的线程
//执行结果:不会开启新的线程,立即执行
- (void)gcdTest4 {
dispatch_queue_t queue = dispatch_queue_create("com.bjsxt", DISPATCH_QUEUE_CONCURRENT);
NSLog(@"开始");
for (NSInteger i = 0 ; i < 10; i ++ ) {
dispatch_sync(queue, ^{
NSLog(@"%@,%@",[NSThread currentThread],@(i));
});
}
NSLog(@"结束");
}
主队列的异步操作
- (void)gcdTest5 {
// 主队列就是一种特殊的串行队列
// 特点:专门负责在主线程上调度任务,不会再子线程中去调度任务,无论是同步或异步中调用任务都只会在主线程上面执行
dispatch_queue_t queue = dispatch_get_main_queue();
NSLog(@"开始");
for (NSInteger i = 0; i < 10; i ++) {
//主队列执行异步操作,异步操作有一个等待的过程
dispatch_async(queue, ^{
NSLog(@"%@",[NSThread currentThread]);
});
}
NSLog(@"结束");
}
主队列的同步操作
- (void)gcdTest6 {
dispatch_queue_t queue = dispatch_get_main_queue();
NSLog(@"1");
//在主队列里执行同步操作,产生死锁
//原因:同步线程等待主线程结束,才会执行任务。主线程等待同步立即执行,才会执行下一个任务。
dispatch_sync(queue, ^{
NSLog(@"2");
});
NSLog(@"3");
}
- (void)gcdTest7
{
//全局队列
//identifier 队列优先级
//flags 苹果预留的参数(没有用)
//DISPATCH_QUEUE_PRIORITY_DEFAULT 一般使用默认优先级
// dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//默认是并发队列,dispatch_get_global_queue用的多
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
for (NSInteger i = 0; i < 10; i++) {
//并发加异步
dispatch_async(queue, ^{
NSLog(@"%@",[NSThread currentThread]);
});
}
}
GCD进程间通信
//button的响应方法
- (IBAction)downLoadImage:(id)sender {
NSLog(@"%@",[NSThread currentThread]);
//获取全局队列
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
//执行异步操作
dispatch_async(queue, ^{
NSLog(@"%@",[NSThread currentThread]);
NSString * urlString = @"http://design.yesky.com/uploadImages/2009/335/20091201140951681.jpg";
NSData * data = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlString]];
UIImage * image = [UIImage imageWithData:data];
//返回主线程更新UI
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"%@",[NSThread currentThread]);
self.imageView.image = image;
});
});
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
//同步操作用途
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
dispatch_sync(queue, ^{
NSLog(@"登录");
});
dispatch_async(queue, ^{
NSLog(@"下载小说A");
});
dispatch_async(queue, ^{
NSLog(@"下载小说B");
});
}
GCD同步异步 串行并行大解析的更多相关文章
- GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例
转:http://www.tuicool.com/articles/NVVnMn (1)GCD实现的同步异步.串行并行. ——同步sync应用场景:用户登录,利用阻塞 ——串行异步应用场景:下载等耗时 ...
- 【iOS开发-91】GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例
(1)GCD实现的同步异步.串行并行. --同步sync应用场景:用户登录,利用堵塞 --串行异步应用场景:下载等耗时间的任务 /** * 由于是异步.所以开通了子线程.可是由于是串行队列,所以仅仅须 ...
- iOS多线程——同步异步串行并行
串行并行异步同步的概念很容易让人混淆,关于这几个概念我在第一篇GCD中有解释,但是还不够清晰,所以这里重写一篇博客专门对这几个概念进行区分: 先说一下队列和任务: (1)队列分为串行和并行,任务的执行 ...
- IOS多线程知识总结/队列概念/GCD/串行/并行/同步/异步
进程:正在进行中的程序被称为进程,负责程序运行的内存分配;每一个进程都有自己独立的虚拟内存空间: 线程:线程是进程中一个独立的执行路径(控制单元);一个进程中至少包含一条线程,即主线程. 队列:dis ...
- [深度思考]·为什么CNN是同步(并行)而RNN是异步(串行)的呢?
为什么CNN是同步(并行)而RNN是异步(串行)的呢? 个人主页--> https://xiaosongshine.github.io/ 1.问题引出 CNN与RNN都是采用parameter ...
- 串行&并行&并发,同步&异步
1. 串行&并行&并发 1.1 串行 这个非常好理解,字面意思,像串成一个串一样,顺序执行 上一个没执行完的话,后面的就必须无条件等待 一般情况就是一个线程里:任务一个接一个执行,类似 ...
- STM32学习笔记(五) USART异步串行口输入输出(轮询模式)
学习是一个简单的过程,只要有善于发掘的眼睛,总能学到新知识,然而如何坚持不懈的学习却很困难,对我亦如此,生活中有太多的诱惑,最后只想说一句勿忘初心.闲话不多扯,本篇讲诉的是异步串行口的输入输出,串口在 ...
- iOS:GCD理解1(同步-异步、串行-并行)
1.并行-异步(ST1与ST2抢占资源) 1-1).获取 并行(全局)队列 ,DISPATCH_QUEUE_PRIORITY_DEFAULT 为默认优先级. dispatch_queue_t queu ...
- iOS:GCD理解1(串行-并行、同步-异步)
1.获取并行.创建串行 队列 1-1).获取 并行(全局) 队列 ,DISPATCH_QUEUE_PRIORITY_DEFAULT 为默认优先级. dispatch_queue_t global_qu ...
随机推荐
- 将RichTextBox的内容直接写入数据库:
将RichTextBox的内容直接写入数据库: private void button1_Click(object sender, EventArgs e) { System.IO.Memory ...
- 【转载】Memcached在.Net中的基本操作
一.Memcached ClientLib For .Net 首先,不得不说,许多语言都实现了连接Memcached的客户端,其中以Perl.PHP为主. 仅仅memcached网站上列出的语言就有: ...
- 【UWP】使用Action代替Command
在Xaml中,说到绑定,我们用的最多的应该就是ICommand了,通过Command实现ViewModel到View之间的命令处理,例如Button默认就提供了Command支持,如下 Xaml: & ...
- 这几天做完简易酒店管理系统,对Sql Server执行计划的浅显了解。
我是一名大三的小学生,今天开始我的第一篇博客,最近随便做了一个简易的酒店管理系统,对sql执行计划有了初步的了解. 查看上面语句的预估执行计划,在工具栏中有这个按钮 聚集索引扫描被称为Index Sc ...
- jQuery漂亮图标的垂直导航菜单
效果展示 http://hovertree.com/texiao/nav/3/ jQuery漂亮图标的垂直导航菜单 是一款当鼠标滑过菜单项时,会有一个背景遮罩层跟着鼠标移动,效果非常炫酷,图标还是矢量 ...
- 为什么要用 Bootstrap
[Bootstrap](http://hovertree.com/menu/bootstrap/) 是由两个 twitter 员工开发并开源的前端框架,非常火爆,而如此火爆自然有它的道理,在我们团队的 ...
- Eclipse设置风格
如果觉得Eclipse的颜色太刺眼,可以修改背景与字体颜色,方法如下: (1)到http://eclipsecolorthemes.org/下载主题文件,可以选择xml文件或者epf文件: (2)Ec ...
- C++静态库和动态库的区别
转自http://www.cnblogs.com/skynet/p/3372855.html 什么是库? 库是写好的现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不可能每个人 ...
- [转载][翻译] IoC 容器和 Dependency Injection 模式
原文地址:Inversion of Control Containers and the Dependency Injection pattern 中文翻译版本是网上的PDF文档,发布在这里仅为方便查 ...
- Jquery UI 和Easy UI常用插件
一.Jquery的插件简介 (一)什么是插件 插件(Plug-in)是一种遵循一定的应用程序接口规范编写出来的程序,是原有系统平台或应用软件平台功能的一种扩展和补充. 注意!!其只能在程序规定的系统平 ...