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 ...
随机推荐
- java运算符 与(&)、非(~)、或(|)、异或(^)
最近看HashMap源码,遇到了这样一段代码: static final int hash(Object key) { int h; return (key == null) ? 0 : (h = k ...
- JS模式---命令模式
var opendoor = { execute: function () { console.log("开门"); } }; var closedoor = { execute: ...
- 「7天自制PHP框架」第一天:路由与控制器
我们为什么要使用路由? 原因1:一个更漂亮的URI 1.URI的改进 刚刚开始学PHP时,我们一定写过blog.php?id=1之类的URI,使用GET方式获取参数.这样的URI有两个缺点,一是容易被 ...
- macOS 下配置 MAMP 开发环境(Mac + Apache + Mysql + PHP)
macOS 中已经内置了 PHP.Python.Ruby.Perl 等常用的脚本语言,以及 Apache HTTP 服务器,所以使用起来非常方便.本文以最新的 macOS Sierra 10.12 配 ...
- Java中实现String.padLeft和String.padRight
因为习惯了C#中的padLeft和padRight,接触Java后突然失去这两个功能,觉得别扭,就试着实现了这两个方法. Java中String.format()中带有字符串对齐功能如下: Syste ...
- python课程day_2-->总结-->字符串功能
=======================课程大纲=======================> 基本数据类型 - 整数 - 布尔值 - 字符串 - 列表 - 元组 - 字典 - 集合 工 ...
- Linux下memcache的安装和启动测试
memcache是一套分布式的高速缓存系统,MemCache的工作流程如下:先检查客户端的请求数据是否在memcached中,如有,直接把请求数据返回,不再对数据库进行任何操作:如果请求的数据不在me ...
- WPF报表自定义通用可筛选列头-WPF特工队内部资料
由于项目需要制作一个可通用的报表多行标题,且可实现各种类型的内容显示,包括文本.输入框.下拉框.多选框等(自定的显示内容可自行扩展),并支持参数绑定转换,效果如下: 源码结构 ColumnItem类: ...
- Win10更新补丁失败后出现无法更新正在撤销 解决办法
系统更新失败,反复重启还是不行,那是不是下载下来的补丁没用了呢??所以我们先要删除Windows更新的缓存文件!在做以下操作之前,首先我们要确认系统内的windows update & BIT ...
- Jdk1.6 JUC源码解析(13)-LinkedBlockingQueue
功能简介: LinkedBlockingQueue是一种基于单向链表实现的有界的(可选的,不指定默认int最大值)阻塞队列.队列中的元素遵循先入先出 (FIFO)的规则.新元素插入到队列的尾部,从队列 ...