GCD 之串行、并行
来源:互联网 发布:淘宝手机如何装修店铺 编辑:程序博客网 时间:2024/04/30 20:56
串行(Serial)
1 UInt32 loopCount = 1000; 2 3 void (^taskFirst)(void) = ^{ 4 NSLog(@"taskFirst 任务开始执行\r\n"); 5 6 for (UInt32 i = 0; i < loopCount; i++) { 7 8 } 9 NSLog(@"taskFirst 任务结束\r\n");10 };11 12 void (^taskSecond)(void) = ^{13 NSLog(@"taskSecond任务开始执行\r\n");14 for (UInt32 i = 0; i < loopCount; i ++) {15 16 }17 NSLog(@"taskSecond 任务结束\r\n");18 };19 dispatch_queue_t serialQueue;20 serialQueue = dispatch_queue_create("serialDemo", NULL);21 dispatch_async(serialQueue, taskFirst);22 NSLog(@"taskfirst 已经加入队列\r\n");23 dispatch_async(serialQueue, taskSecond);24 NSLog(@"tasksecond 已经加入队列\r\n");
运行得到结果1:
2012-05-14 18:45:01.766 GDCDemo[389:f803] taskfirst 已经加入队列
2012-05-14 18:45:01.766 GDCDemo[389:11103] taskFirst 任务开始执行
2012-05-14 18:45:01.767 GDCDemo[389:f803] tasksecond 已经加入队列
2012-05-14 18:45:01.768 GDCDemo[389:11103] taskFirst 任务结束
2012-05-14 18:45:01.768 GDCDemo[389:11103] taskSecond任务开始执行
2012-05-14 18:45:01.772 GDCDemo[389:11103] taskSecond 任务结束
运行结果跟我们的预计一样,taskFirst执行完之后,才执行taskSecond。而且,通过“xxx任务加入队列”的提示,任务运行的线程跟主线程不是同一个。
下面,我们继续对代码做点调整,让它演示不同队列之间的任务并行运行。
1 UInt32 loopCount = 1000; 2 UInt32 loopCountFirst = 10000000; 3 4 void (^taskFirst)(void) = ^{ 5 NSLog(@"taskFirst 任务开始执行\r\n"); 6 7 //延长taskFirst的运行时间 8 for (UInt32 i = 0; i < loopCountFirst; i++) { 9 10 }11 NSLog(@"taskFirst 任务结束\r\n");12 };13 14 void (^taskSecond)(void) = ^{15 NSLog(@"taskSecond任务开始执行\r\n");16 for (UInt32 i = 0; i < loopCount; i ++) {17 18 }19 NSLog(@"taskSecond 任务结束\r\n");20 };21 dispatch_queue_t serialQueue;22 serialQueue = dispatch_queue_create("serialDemo", NULL);23 //创建第二个队列24 dispatch_queue_t serialQueueSecond = dispatch_queue_create("serialSecondDemo", NULL);25 dispatch_async(serialQueue, taskFirst);26 NSLog(@"taskfirst 已经加入队列\r\n");27 dispatch_async(serialQueueSecond, taskSecond);28 NSLog(@"tasksecond 已经加入队列\r\n");
运行得到结果2:
2012-05-14 19:07:22.951 GDCDemo[456:f803] taskfirst 已经加入队列
2012-05-14 19:07:22.951 GDCDemo[456:11103] taskFirst 任务开始执行
2012-05-14 19:07:22.953 GDCDemo[456:f803] tasksecond 已经加入队列
2012-05-14 19:07:22.953 GDCDemo[456:12c03] taskSecond任务开始执行
2012-05-14 19:07:22.954 GDCDemo[456:12c03] taskSecond 任务结束
2012-05-14 19:07:22.977 GDCDemo[456:11103] taskFirst 任务结束
由此可见,taskSecond是添加到队列后立即执行的。两个串行队列之间的任务是互不影响的。
并行(Concurrent)
1 dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);2 dispatch_async(concurrentQueue, taskFirst);3 NSLog(@"taskfirst 已经加入队列\r\n");4 dispatch_async(concurrentQueue, taskSecond);5 NSLog(@"tasksecond 已经加入队列\r\n");
运行,结果与结果2相同。说明了,taskFirst和taskSecond是同时运行的。
主调度队列(main dispatch queue)
dispatch_async(dispatch_get_main_queue(), ^{
.....//跟新界面的操作
});
- GCD 之串行、并行
- GCD之并行串行区别
- iOS多线程之GCD(串行,并行)
- gcd并行串行
- GCD之串行队列和并行队列及dispatch_group
- GCD 的使用 并行串行 队列
- GCD的串行队列和并行队列
- iOS详解 GCD 串行队列并行队列
- GCD简析(同步、异步、串行、并行)
- GCD之 串行队列,并行队列,全局队列,主线程队列
- GCD同步与异步,串行与并行深入讲解
- GCD编程中串行、并行、同步、异步的执行顺序
- GCD 串行队列和并行队列以及dispatch_group
- GCD自己创建串行队列和并行队列
- IOS学习 GCD 基础 串行/并行/主线程、同步/异步
- gcd中同步异步并行串行线程数目的关系
- GCD 中串行队列、并行队列、dispatch_sync、dispatch_async的关系
- GCD 队列串行 并行 同步 异步 小例
- poj1742coins【单调队列优化多重背包】楼教主八题
- JSON.stringify 语法实例讲解
- jquery通过prop函数验证checkbox是否选中
- Ext.Ajax类
- 几个很实用的编程网站
- GCD 之串行、并行
- 百鸡问题
- 给Eclipse提速的7个技巧
- Service的一个小例子
- 黑马程序员_选择排序与冒泡排序
- iOS 启动页的设置
- vlc命令行大全
- android中src和background区别
- php数组运用,用本身的value做key