时间:2021-05-02
详解IOS串行队列与并行队列进行同步或者异步的实例
IOS中GCD的队列分为串行队列和并行队列,任务分为同步任务和异步任务,他们的排列组合有四种情况,下面分析这四种情况的工作方式。
同步任务,使用GCD dispatch_sync 进行派发任务
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 - (void)testSync { dispatch_queue_t serialQueue = dispatch_queue_create("com.zyt.queue", DISPATCH_QUEUE_SERIAL); dispatch_queue_t concurrentQueue = dispatch_queue_create("com.zyt.queue", DISPATCH_QUEUE_CONCURRENT); NSLog(@"====serialQueue===="); for (int i = 0; i<10; i++) { dispatch_sync(serialQueue, ^{ [NSThread sleepForTimeInterval:0.3]; NSLog(@"==>%@ sync serial XXX>%d", [NSThread currentThread], i); }); } NSLog(@"====concurrentQueue===="); for (int i = 0; i<10; i++) { dispatch_sync(concurrentQueue, ^{ [NSThread sleepForTimeInterval:0.3]; NSLog(@"==>%@ sync concurrent ====>%d", [NSThread currentThread], i*i); }); } }结果如下:
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 2017-03-01 01:36:22.835 Demo ====serialQueue==== 2017-03-01 01:36:23.207 {number = 1, name = main} sync serial XXX>0 2017-03-01 01:36:23.578 {number = 1, name = main} sync serial XXX>1 2017-03-01 01:36:23.952 {number = 1, name = main} sync serial XXX>2 2017-03-01 01:36:24.325 {number = 1, name = main} sync serial XXX>3 2017-03-01 01:36:24.699 {number = 1, name = main} sync serial XXX>4 2017-03-01 01:36:25.072 {number = 1, name = main} sync serial XXX>5 2017-03-01 01:36:25.446 {number = 1, name = main} sync serial XXX>6 2017-03-01 01:36:25.746 {number = 1, name = main} sync serial XXX>7 2017-03-01 01:36:26.122 {number = 1, name = main} sync serial XXX>8 2017-03-01 01:36:26.489 {number = 1, name = main} sync serial XXX>9 2017-03-01 01:36:26.489 Demo ====concurrentQueue==== 2017-03-01 01:36:26.864 {number = 1, name = main} sync concurrent ====>0 2017-03-01 01:36:27.236 {number = 1, name = main} sync concurrent ====>1 2017-03-01 01:36:27.611 {number = 1, name = main} sync concurrent ====>4 2017-03-01 01:36:27.985 {number = 1, name = main} sync concurrent ====>9 2017-03-01 01:36:28.354 {number = 1, name = main} sync concurrent ====>16 2017-03-01 01:36:28.726 {number = 1, name = main} sync concurrent ====>25 2017-03-01 01:36:29.100 {number = 1, name = main} sync concurrent ====>36 2017-03-01 01:36:29.474 {number = 1, name = main} sync concurrent ====>49 2017-03-01 01:36:29.849 {number = 1, name = main} sync concurrent ====>64 2017-03-01 01:36:30.223 {number = 1, name = main} sync concurrent ====>81testSync方法是在主线程中调用的,结果看到使用的串行队列和使用并行队列看到的结果都是发生在当前线程:主线程中,没有开启新的线程处理任务,任务的调度也是串行调度的。
异步任务,使用GCD dispatch_async 进行派发任务
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 - (void)testAsync { dispatch_queue_t serialQueue = dispatch_queue_create("com.zyt.queue", DISPATCH_QUEUE_SERIAL); dispatch_queue_t concurrentQueue = dispatch_queue_create("com.zyt.queue", DISPATCH_QUEUE_CONCURRENT); NSLog(@"====serialQueue===="); for (int i = 0; i<10; i++) { dispatch_async(serialQueue, ^{ [NSThread sleepForTimeInterval:0.3]; NSLog(@"==>%@ async serial XXX>%d", [NSThread currentThread], i); }); } NSLog(@"====concurrentQueue===="); for (int i = 0; i<10; i++) { dispatch_async(concurrentQueue, ^{ [NSThread sleepForTimeInterval:0.3]; NSLog(@"==>%@ async concurrent ====>%d", [NSThread currentThread], i*i); }); } } `结果如下:
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 2017-03-01 01:45:36.125 Demo ====serialQueue==== 2017-03-01 01:45:36.125 Demo ====concurrentQueue==== 2017-03-01 01:45:36.494 {number = 3, name = (null)} async concurrent ====>0 2017-03-01 01:45:36.494 {number = 5, name = (null)} async concurrent ====>4 2017-03-01 01:45:36.494 {number = 4, name = (null)} async concurrent ====>1 2017-03-01 01:45:36.494 {number = 6, name = (null)} async concurrent ====>16 2017-03-01 01:45:36.494 {number = 8, name = (null)} async serial XXX>0 2017-03-01 01:45:36.494 {number = 7, name = (null)} async concurrent ====>9 2017-03-01 01:45:36.494 {number = 9, name = (null)} async concurrent ====>25 2017-03-01 01:45:36.494 {number = 11, name = (null)} async concurrent ====>49 2017-03-01 01:45:36.494 {number = 10, name = (null)} async concurrent ====>36 2017-03-01 01:45:36.501 {number = 13, name = (null)} async concurrent ====>81 2017-03-01 01:45:36.501 {number = 12, name = (null)} async concurrent ====>64 2017-03-01 01:45:36.869 {number = 8, name = (null)} async serial XXX>1 2017-03-01 01:45:37.244 {number = 8, name = (null)} async serial XXX>2 2017-03-01 01:45:37.615 {number = 8, name = (null)} async serial XXX>3 2017-03-01 01:45:37.986 {number = 8, name = (null)} async serial XXX>4 2017-03-01 01:45:38.358 {number = 8, name = (null)} async serial XXX>5 2017-03-01 01:45:38.730 {number = 8, name = (null)} async serial XXX>6 2017-03-01 01:45:39.103 {number = 8, name = (null)} async serial XXX>7 2017-03-01 01:45:39.472 {number = 8, name = (null)} async serial XXX>8 2017-03-01 01:45:39.842 {number = 8, name = (null)} async serial XXX>9 testSync方法是在主线程中调用的,结果看到使用的串行队列的异步任务会开启一个子线程执行任务,任务的调度是串行的
使用并行队列的异步任务会开启多个子线程并行的处理任务,任务的先后顺序是不固定的,任务的调度方式是并行的
总结
同步任务:和使用的队列无关,不会开启子线程处理任务,会在当前的线程中串行的调度任务,即一个任务完成之后继续下一个任务,如果同步任务在主线程中调用,会阻塞主线程
异步任务:a. 使用串行队列,会开启一个子线程串行的调度任务 b. 使用并行队列,会开启多个子线程并行的调度任务,这种情况用的是最多的。
以上就是对详解IOS串行队列与并行队列进行同步或者异步的实例,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
原文链接:https://my.oschina.net/u/1242477/blog/848103
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
iOS-GCD使用详解前言对初学者来说,GCD似乎是一道迈不过去的坎,很多人在同步、异步、串行、并行和死锁这几个名词的漩涡中渐渐放弃治疗。本文将使用图文表并茂的
GCD的基本使用一、主队列介绍主队列:是和主线程相关联的队列,主队列是GCD自带的一种特殊的串行队列,放在主队列中得任务,都会放到主线程中执行。提示:如果把任务
5.异步队列Deferred5.1概述异步队列是一个链式对象,增强对回调函数的管理和调用,用于处理异步任务。异步队列有三种状态:初始化(unresolved),
c++优先队列用法详解优先队列也是队列这种数据结构的一种。它的操作不仅局限于队列的先进先出,可以按逻辑(按最大值或者最小值等出队列)。普通的队列是一种先进先出的
Android消息队列模型详解及实例Android系统的消息队列和消息循环都是针对具体线程的,一个线程可以存在(当然也可以不存在)一个消息队列(MessageQ