详解IOS串行队列与并行队列进行同步或者异步的实例
详解IOS串行队列与并行队列进行同步或者异步的实例
IOS中GCD的队列分为串行队列和并行队列,任务分为同步任务和异步任务,他们的排列组合有四种情况,下面分析这四种情况的工作方式。
同步任务,使用GCDdispatch_sync进行派发任务
-(void)testSync{ dispatch_queue_tserialQueue=dispatch_queue_create("com.zyt.queue",DISPATCH_QUEUE_SERIAL); dispatch_queue_tconcurrentQueue=dispatch_queue_create("com.zyt.queue",DISPATCH_QUEUE_CONCURRENT); NSLog(@"====serialQueue===="); for(inti=0;i<10;i++){ dispatch_sync(serialQueue,^{ [NSThreadsleepForTimeInterval:0.3]; NSLog(@"==>%@syncserialXXX>%d",[NSThreadcurrentThread],i); }); } NSLog(@"====concurrentQueue===="); for(inti=0;i<10;i++){ dispatch_sync(concurrentQueue,^{ [NSThreadsleepForTimeInterval:0.3]; NSLog(@"==>%@syncconcurrent====>%d",[NSThreadcurrentThread],i*i); }); } }
结果如下:
2017-03-0101:36:22.835Demo====serialQueue==== 2017-03-0101:36:23.207{number=1,name=main}syncserialXXX>0 2017-03-0101:36:23.578{number=1,name=main}syncserialXXX>1 2017-03-0101:36:23.952{number=1,name=main}syncserialXXX>2 2017-03-0101:36:24.325{number=1,name=main}syncserialXXX>3 2017-03-0101:36:24.699{number=1,name=main}syncserialXXX>4 2017-03-0101:36:25.072{number=1,name=main}syncserialXXX>5 2017-03-0101:36:25.446{number=1,name=main}syncserialXXX>6 2017-03-0101:36:25.746{number=1,name=main}syncserialXXX>7 2017-03-0101:36:26.122{number=1,name=main}syncserialXXX>8 2017-03-0101:36:26.489{number=1,name=main}syncserialXXX>9 2017-03-0101:36:26.489Demo====concurrentQueue==== 2017-03-0101:36:26.864{number=1,name=main}syncconcurrent====>0 2017-03-0101:36:27.236{number=1,name=main}syncconcurrent====>1 2017-03-0101:36:27.611{number=1,name=main}syncconcurrent====>4 2017-03-0101:36:27.985{number=1,name=main}syncconcurrent====>9 2017-03-0101:36:28.354{number=1,name=main}syncconcurrent====>16 2017-03-0101:36:28.726{number=1,name=main}syncconcurrent====>25 2017-03-0101:36:29.100{number=1,name=main}syncconcurrent====>36 2017-03-0101:36:29.474{number=1,name=main}syncconcurrent====>49 2017-03-0101:36:29.849{number=1,name=main}syncconcurrent====>64 2017-03-0101:36:30.223{number=1,name=main}syncconcurrent====>81
testSync方法是在主线程中调用的,结果看到使用的串行队列和使用并行队列看到的结果都是发生在当前线程:主线程中,没有开启新的线程处理任务,任务的调度也是串行调度的。
异步任务,使用GCDdispatch_async进行派发任务
-(void)testAsync{ dispatch_queue_tserialQueue=dispatch_queue_create("com.zyt.queue",DISPATCH_QUEUE_SERIAL); dispatch_queue_tconcurrentQueue=dispatch_queue_create("com.zyt.queue",DISPATCH_QUEUE_CONCURRENT); NSLog(@"====serialQueue===="); for(inti=0;i<10;i++){ dispatch_async(serialQueue,^{ [NSThreadsleepForTimeInterval:0.3]; NSLog(@"==>%@asyncserialXXX>%d",[NSThreadcurrentThread],i); }); } NSLog(@"====concurrentQueue===="); for(inti=0;i<10;i++){ dispatch_async(concurrentQueue,^{ [NSThreadsleepForTimeInterval:0.3]; NSLog(@"==>%@asyncconcurrent====>%d",[NSThreadcurrentThread],i*i); }); } } `
结果如下:
2017-03-0101:45:36.125Demo====serialQueue==== 2017-03-0101:45:36.125Demo====concurrentQueue==== 2017-03-0101:45:36.494{number=3,name=(null)}asyncconcurrent====>0 2017-03-0101:45:36.494{number=5,name=(null)}asyncconcurrent====>4 2017-03-0101:45:36.494{number=4,name=(null)}asyncconcurrent====>1 2017-03-0101:45:36.494{number=6,name=(null)}asyncconcurrent====>16 2017-03-0101:45:36.494{number=8,name=(null)}asyncserialXXX>0 2017-03-0101:45:36.494{number=7,name=(null)}asyncconcurrent====>9 2017-03-0101:45:36.494{number=9,name=(null)}asyncconcurrent====>25 2017-03-0101:45:36.494{number=11,name=(null)}asyncconcurrent====>49 2017-03-0101:45:36.494{number=10,name=(null)}asyncconcurrent====>36 2017-03-0101:45:36.501{number=13,name=(null)}asyncconcurrent====>81 2017-03-0101:45:36.501{number=12,name=(null)}asyncconcurrent====>64 2017-03-0101:45:36.869{number=8,name=(null)}asyncserialXXX>1 2017-03-0101:45:37.244{number=8,name=(null)}asyncserialXXX>2 2017-03-0101:45:37.615{number=8,name=(null)}asyncserialXXX>3 2017-03-0101:45:37.986{number=8,name=(null)}asyncserialXXX>4 2017-03-0101:45:38.358{number=8,name=(null)}asyncserialXXX>5 2017-03-0101:45:38.730{number=8,name=(null)}asyncserialXXX>6 2017-03-0101:45:39.103{number=8,name=(null)}asyncserialXXX>7 2017-03-0101:45:39.472{number=8,name=(null)}asyncserialXXX>8 2017-03-0101:45:39.842{number=8,name=(null)}asyncserialXXX>9
testSync方法是在主线程中调用的,结果看到使用的串行队列的异步任务会开启一个子线程执行任务,任务的调度是串行的
使用并行队列的异步任务会开启多个子线程并行的处理任务,任务的先后顺序是不固定的,任务的调度方式是并行的
总结
同步任务:和使用的队列无关,不会开启子线程处理任务,会在当前的线程中串行的调度任务,即一个任务完成之后继续下一个任务,如果同步任务在主线程中调用,会阻塞主线程
异步任务:a.使用串行队列,会开启一个子线程串行的调度任务b.使用并行队列,会开启多个子线程并行的调度任务,这种情况用的是最多的。
以上就是对详解IOS串行队列与并行队列进行同步或者异步的实例,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!