iOS gcd 串行,并行,同步,异步代码研究
参考文章:
http://www.cnblogs.com/mddblog/p/4767559.html
重要结论:
1)串行队列,同步执行-----串行队列意味着顺序执行,同步执行意味着不开启线程(在当前线程执行)
2)串行队列,异步执行-----串行队列意味着任务顺序执行,异步执行说明要开线程, (如果开多个线程的话,不能保证串行队列顺序执行,所以只开一个线程)
3)并行队列,异步执行-----并行队列意味着执行顺序不确定,异步执行意味着会开启线程,而并行队列又允许不按顺序执行,所以系统为了提高性能会开启多个线程,来队列取任务(队列中任务取出仍然是顺序取出的,只是线程执行无序)。
4)并行队列,同步执行-----同步执行意味着不开线程,则肯定是顺序执行
分别进行验证
串行同步
// 串行同步
- (void)test_queue_serial_sync
{
NSLog(@"串行同步");
dispatch_queue_t queue = dispatch_queue_create("com.demo.001", DISPATCH_QUEUE_SERIAL);
NSLog(@"main thread:%p", [NSThread mainThread]);
dispatch_sync(queue, ^{
NSLog(@"1 thread: %p", [NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"2 thread: %p", [NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"3 thread: %p", [NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"4 thread: %p", [NSThread currentThread]);
});
}
// 结果
2017-02-10 18:00:21.991383 RXVerifyExample[4927:2465789] 串行同步
2017-02-10 18:00:21.991636 RXVerifyExample[4927:2465789] main thread:0x17406cb00
2017-02-10 18:00:21.992020 RXVerifyExample[4927:2465789] 1 thread: 0x17406cb00
2017-02-10 18:00:21.992097 RXVerifyExample[4927:2465789] 2 thread: 0x17406cb00
2017-02-10 18:00:21.992165 RXVerifyExample[4927:2465789] 3 thread: 0x17406cb00
2017-02-10 18:00:21.992230 RXVerifyExample[4927:2465789] 4 thread: 0x17406cb00
结论:
串行同步,不创建任何新的线程,因为是在主线程中执行这个方法的,所以,同步方法都在主线程。
并行同步
// 并行同步
- (void)test_queue_concurrent_sync
{
NSLog(@"并行同步");
dispatch_queue_t queue = dispatch_queue_create("com.demo.002", DISPATCH_QUEUE_CONCURRENT);
NSLog(@"main thread:%p", [NSThread mainThread]);
dispatch_sync(queue, ^{
NSLog(@"1 thread: %p", [NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"2 thread: %p", [NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"3 thread: %p", [NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"4 thread: %p", [NSThread currentThread]);
});
}
// 结果:
2017-02-10 18:04:33.107907 RXVerifyExample[4930:2467403] 并行同步
2017-02-10 18:04:33.108053 RXVerifyExample[4930:2467403] main thread:0x174066600
2017-02-10 18:04:33.108121 RXVerifyExample[4930:2467403] 1 thread: 0x174066600
2017-02-10 18:04:33.108177 RXVerifyExample[4930:2467403] 2 thread: 0x174066600
2017-02-10 18:04:33.108219 RXVerifyExample[4930:2467403] 3 thread: 0x174066600
2017-02-10 18:04:33.108259 RXVerifyExample[4930:2467403] 4 thread: 0x174066600
结论:跟串行同步是一样的。
串行异步1
// 串行异步1
- (void)test_queue_serial_async1
{
NSLog(@"串行异步方法1");
dispatch_queue_t queue = dispatch_queue_create("com.demo.0031", DISPATCH_QUEUE_SERIAL);
NSLog(@"main thread:%p", [NSThread mainThread]);
dispatch_async(queue, ^{
NSLog(@"1 thread: %p", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"2 thread: %p", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"3 thread: %p", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"4 thread: %p", [NSThread currentThread]);
});
}
// 结果:
-- ::15.124048 RXVerifyExample[:] 串行异步方法1
-- ::15.124244 RXVerifyExample[:] main thread:0x174076a40
-- ::15.125490 RXVerifyExample[:] thread: 0x174271800
-- ::15.125574 RXVerifyExample[:] thread: 0x174271800
-- ::15.125643 RXVerifyExample[:] thread: 0x174271800
-- ::15.125710 RXVerifyExample[:] thread: 0x174271800
串行异步2
// 串行异步2
- (void)test_queue_serial_async2
{
NSLog(@"串行异步方法2");
dispatch_queue_t queue = dispatch_queue_create("com.demo.0032", DISPATCH_QUEUE_SERIAL);
NSLog(@"main thread:%p", [NSThread mainThread]);
dispatch_async(queue, ^{
NSLog(@"1 thread: %p", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"2 thread: %p", [NSThread currentThread]);
});
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:4.1];
NSLog(@"3 thread: %p", [NSThread currentThread]);
});
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:3.1];
NSLog(@"4 thread: %p", [NSThread currentThread]);
});
}
// 结果
-- ::16.478508 RXVerifyExample[:] 串行异步方法2
-- ::16.478611 RXVerifyExample[:] main thread:0x170072380
-- ::16.479034 RXVerifyExample[:] thread: 0x174264240
-- ::16.479069 RXVerifyExample[:] thread: 0x174264240
-- ::20.584321 RXVerifyExample[:] thread: 0x174264240
-- ::23.689611 RXVerifyExample[:] thread: 0x174264240
结论:
串行异步只创建一个新的线程
并行异步1
// 并行异步1
- (void)test_queue_concurrent_async1
{
NSLog(@"并行异步方法1");
dispatch_queue_t queue = dispatch_queue_create("com.demo.0041", DISPATCH_QUEUE_CONCURRENT);
NSLog(@"main thread:%p", [NSThread mainThread]);
dispatch_async(queue, ^{
NSLog(@"1 thread: %p", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"2 thread: %p", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"3 thread: %p", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"4 thread: %p", [NSThread currentThread]);
});
} // 结果
-- ::25.692681 RXVerifyExample[:] 并行异步方法1
-- ::25.692880 RXVerifyExample[:] main thread:0x174073000
-- ::25.693828 RXVerifyExample[:] thread: 0x174267d00
-- ::25.693916 RXVerifyExample[:] thread: 0x174267d00
-- ::25.693988 RXVerifyExample[:] thread: 0x174267d00
-- ::25.694056 RXVerifyExample[:] thread: 0x174267d00
并行异步2
// 并行异步2
- (void)test_queue_concurrent_async2
{
NSLog(@"并行异步方法2");
dispatch_queue_t queue = dispatch_queue_create("com.demo.0042", DISPATCH_QUEUE_CONCURRENT);
NSLog(@"main thread:%p", [NSThread mainThread]);
dispatch_async(queue, ^{
NSLog(@"1 thread: %p", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"2 thread: %p", [NSThread currentThread]);
});
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:4.1];
NSLog(@"3 thread: %p", [NSThread currentThread]);
});
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:3.1];
NSLog(@"4 thread: %p", [NSThread currentThread]);
});
}
// 结果
-- ::27.262009 RXVerifyExample[:] 并行异步方法2
-- ::27.262213 RXVerifyExample[:] main thread:0x17406e080
-- ::27.263710 RXVerifyExample[:] thread: 0x174262e80
-- ::27.263811 RXVerifyExample[:] thread: 0x174262e80
-- ::30.369209 RXVerifyExample[:] thread: 0x1742648c0
-- ::31.369205 RXVerifyExample[:] thread: 0x174262e80
并行异步3
// 并行异步3
- (void)test_queue_concurrent_async3
{
NSLog(@"并行异步方法3");
dispatch_queue_t queue = dispatch_queue_create("com.demo.0043", DISPATCH_QUEUE_CONCURRENT);
NSLog(@"main thread:%p", [NSThread mainThread]);
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:2.1];
NSLog(@"1 thread: %p", [NSThread currentThread]);
});
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:1.1];
NSLog(@"2 thread: %p", [NSThread currentThread]);
});
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:4.1];
NSLog(@"3 thread: %p", [NSThread currentThread]);
});
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:3.1];
NSLog(@"4 thread: %p", [NSThread currentThread]);
});
}
//结果
-- ::59.926988 RXVerifyExample[:] 并行异步方法3
-- ::59.927184 RXVerifyExample[:] main thread:0x17007f8c0
-- ::01.033209 RXVerifyExample[:] thread: 0x170462ac0
-- ::02.033478 RXVerifyExample[:] thread: 0x170462f40
-- ::03.037799 RXVerifyExample[:] thread: 0x170462a40
-- ::04.033691 RXVerifyExample[:] thread: 0x170462480
从并行异步的三个例子来看。
创建的新的线程的数目是不确定的,是跟队列中异步方法个数和异步方法执行的时间有关。
iOS gcd 串行,并行,同步,异步代码研究的更多相关文章
- IOS多线程知识总结/队列概念/GCD/串行/并行/同步/异步
进程:正在进行中的程序被称为进程,负责程序运行的内存分配;每一个进程都有自己独立的虚拟内存空间: 线程:线程是进程中一个独立的执行路径(控制单元);一个进程中至少包含一条线程,即主线程. 队列:dis ...
- Python并发编程系列之常用概念剖析:并行 串行 并发 同步 异步 阻塞 非阻塞 进程 线程 协程
1 引言 并发.并行.串行.同步.异步.阻塞.非阻塞.进程.线程.协程是并发编程中的常见概念,相似却也有却不尽相同,令人头痛,这一篇博文中我们来区分一下这些概念. 2 并发与并行 在解释并发与并行之前 ...
- IOS多线程知识总结/队列概念/GCD/主队列/并行队列/全局队列/主队列/串行队列/同步任务/异步任务区别(附代码)
进程:正在进行中的程序被称为进程,负责程序运行的内存分配;每一个进程都有自己独立的虚拟内存空间 线程:线程是进程中一个独立的执行路径(控制单元);一个进程中至少包含一条线程,即主线程 队列 dispa ...
- 【iOS开发-91】GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例
(1)GCD实现的同步异步.串行并行. --同步sync应用场景:用户登录,利用堵塞 --串行异步应用场景:下载等耗时间的任务 /** * 由于是异步.所以开通了子线程.可是由于是串行队列,所以仅仅须 ...
- GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例
转:http://www.tuicool.com/articles/NVVnMn (1)GCD实现的同步异步.串行并行. ——同步sync应用场景:用户登录,利用阻塞 ——串行异步应用场景:下载等耗时 ...
- iOS多线程——同步异步串行并行
串行并行异步同步的概念很容易让人混淆,关于这几个概念我在第一篇GCD中有解释,但是还不够清晰,所以这里重写一篇博客专门对这几个概念进行区分: 先说一下队列和任务: (1)队列分为串行和并行,任务的执行 ...
- 串行&并行&并发,同步&异步
1. 串行&并行&并发 1.1 串行 这个非常好理解,字面意思,像串成一个串一样,顺序执行 上一个没执行完的话,后面的就必须无条件等待 一般情况就是一个线程里:任务一个接一个执行,类似 ...
- 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 ...
随机推荐
- 修改linux系统时间和同步
date 查看当前时间 date -s 15:14:13 修改时间 cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 修改时区 yes cront ...
- HTTP长连接、短连接使用及测试
概念 HTTP短连接(非持久连接)是指,客户端和服务端进行一次HTTP请求/响应之后,就关闭连接.所以,下一次的HTTP请求/响应操作就需要重新建立连接. HTTP长连接(持久连接)是指,客户端和服务 ...
- 把上传Github的代码添加Cocoapods支持
开始 这里我将从最初的开始进行介绍,包括Github上创建项目已经上传项目,到最后的支持Cocoapods. 步骤如下: 代码上传Github 创建podspec文件,并验证是否通过 在Github上 ...
- 深刻认识shift_ram IP core——图像处理学习笔记
在进行图像处理算法中,往往需要生成图像像素矩阵,这对于C语言来说可以直接用数据表示,但是对于verilog来说便不是那么容易了,硬件描述语言不比软件,它的核心不再算法,而是在于设计思想,加速硬件.在进 ...
- sdkman安装
软件开发工具管理包(Software Development Kit Manager,简称SDKMAN) 用来管理多个版本的开发环境的工具.提供命令行来安装.切换.删除.列出候选版本. 官网地址:ht ...
- JDK版本不匹配...
Java compiler level does not match the version of the installed Java project facet. 今天从把交通厅的项目,导进来就报 ...
- django restframework serializer 增加自定义字段
在使用django restframework serializer 序列化在django中定义的model时,有时候我们需要额外在serializer中增加一些model中没有的字段.有两种方法实现 ...
- Docker基于已有的镜像制新的镜像
1.根据运行的容器制作镜像 #查看所有的容器 docker ps #暂停当前容器 docker pause COTNAINER-ID #将容器运行当前状态提交 docker commit COTNAI ...
- linux下登陆MongoDB的两种方式
第一种:不带auth认证的 第二种:需要带auth认证的(即需要用户名和密码的) 当指定用户名和密码在查看数据,发现就可以看得到了 查看文章:开启MongoDB客户端访问控制
- TCP协议详解---上
TCP头格式 注意以下几点: TCP的包是没有IP地址的,那是IP层上的事.但是有源端口和目标端口. 一个TCP连接需要四个元组来表示是同一个连接(src_ip, src_port, dst_ip, ...