iOS GCD中串行、并行、同步、异步执行顺序的研究
2018-04-08 15:59
465 查看
话不多说, 研究一点GCD的知识
1.串行队列+同步执行 DISPATCH_QUEUE_SERIAL为串行队列
- (void)gcdTest { dispatch_queue_t q = dispatch_queue_create("yzq.gsctest", DISPATCH_QUEUE_SERIAL); NSLog(@"S--%@",[NSThread currentThread]); dispatch_sync(q, ^{ NSLog(@"sync--%@",[NSThread currentThread]); }); NSLog(@"E--%@",[NSThread currentThread]);}
首先我们来看一下打印的结果
2018-04-08 15:27:08.166974+0800 Test180403[2200:149142] S--<NSThread: 0x60000006a780>{number = 1, name = main}2018-04-08 15:27:08.167221+0800 Test180403[2200:149142] sync--<NSThread: 0x60000006a780>{number = 1, name = main}2018-04-08 15:27:08.167361+0800 Test180403[2200:149142] E--<NSThread: 0x60000006a780>{number = 1, name = main}
我们来分析一下:
我们创建了一个串行的一个队列,然后往这个队列中添加了一个同步的任务,首先在主线程中打印了S,此时我们添加的这个同步队列阻碍了当前的线程,需要等到这个线程中任务执行完毕才进行下一步的任务
2:串行队列+异步执行
- (void)gcdTest { dispatch_queue_t q = dispatch_queue_create("yzq.gsctest", DISPATCH_QUEUE_SERIAL); NSLog(@"S--%@",[NSThread currentThread]); dispatch_async(q, ^{ NSLog(@"sync--%@",[NSThread currentThread]); }); NSLog(@"E--%@",[NSThread currentThread]);}
我们来看打印结果:
2018-04-08 15:38:55.435107+0800 Test180403[2340:155472] S--<NSThread: 0x604000076b00>{number = 1, name = main}2018-04-08 15:38:55.435392+0800 Test180403[2340:155472] E--<NSThread: 0x604000076b00>{number = 1, name = main}2018-04-08 15:38:55.435412+0800 Test180403[2340:155537] sync--<NSThread: 0x604000462380>{number = 3, name = (null)}
分析:
我们创建了一个串行的一个队列,首先在主线程中打印了S,然后往这个队列中添加了一个异步的任务,但是此时也只是添加进去了并没有立即执行这个线程,当主线程的任务执行完毕了才会取出主线程中的异步队列进行执行.
3.并行队列+同步执行 DISPATCH_QUEUE_CONCURRENT为并行队列
- (void)gcdTest { dispatch_queue_t q = dispatch_queue_create("yzq.gsctest", DISPATCH_QUEUE_CONCURRENT); NSLog(@"S--%@",[NSThread currentThread]); dispatch_sync(q, ^{ NSLog(@"sync--%@",[NSThread currentThread]); }); NSLog(@"E--%@",[NSThread currentThread]);}
看看打印结果:
2018-04-08 15:46:10.614840+0800 Test180403[2432:159361] S--<NSThread: 0x60400006da40>{number = 1, name = main}2018-04-08 15:46:10.615052+0800 Test180403[2432:159361] sync--<NSThread: 0x60400006da40>{number = 1, name = main}2018-04-08 15:46:10.615169+0800 Test180403[2432:159361] E--<NSThread: 0x60400006da40>{number = 1, name = main}
分析:
我们创建了一个并行的队列,刚开始会在主线程中打印S 然后往这个并行队列中添加了一个同步任务,此时主线程在执行dispatch_sync方法后阻塞了当前线程,去等待dispatch_sync方法里面的block执行完毕,等到所有同步任务执行完毕后,才去执行后面的操作,所有的打印都是在主线程完成的。
4:并行队列+异步执行
- (void)gcdTest { dispatch_queue_t q = dispatch_queue_create("yzq.gsctest", DISPATCH_QUEUE_CONCURRENT); NSLog(@"S--%@",[NSThread currentThread]); dispatch_async(q, ^{ NSLog(@"async--%@",[NSThread currentThread]); }); NSLog(@"E--%@",[NSThread currentThread]);}
看看打印结果:
2018-04-08 15:52:59.861249+0800 Test180403[2503:162803] S--<NSThread: 0x600000078180>{number = 1, name = main}2018-04-08 15:52:59.861584+0800 Test180403[2503:162803] E--<NSThread: 0x600000078180>{number = 1, name = main}2018-04-08 15:52:59.861603+0800 Test180403[2503:162867] async--<NSThread: 0x604000279340>{number = 3, name = (null)}
分析一下:
首先创建了一个并行的队列,打印S,然后往这个并行队列中添加了一个异步线程,但是并没有立即执行,当主线程任务执行完毕之后再从并行队列中依次开辟线程来执行操作.
1.串行队列+同步执行 DISPATCH_QUEUE_SERIAL为串行队列
- (void)gcdTest { dispatch_queue_t q = dispatch_queue_create("yzq.gsctest", DISPATCH_QUEUE_SERIAL); NSLog(@"S--%@",[NSThread currentThread]); dispatch_sync(q, ^{ NSLog(@"sync--%@",[NSThread currentThread]); }); NSLog(@"E--%@",[NSThread currentThread]);}
首先我们来看一下打印的结果
2018-04-08 15:27:08.166974+0800 Test180403[2200:149142] S--<NSThread: 0x60000006a780>{number = 1, name = main}2018-04-08 15:27:08.167221+0800 Test180403[2200:149142] sync--<NSThread: 0x60000006a780>{number = 1, name = main}2018-04-08 15:27:08.167361+0800 Test180403[2200:149142] E--<NSThread: 0x60000006a780>{number = 1, name = main}
我们来分析一下:
我们创建了一个串行的一个队列,然后往这个队列中添加了一个同步的任务,首先在主线程中打印了S,此时我们添加的这个同步队列阻碍了当前的线程,需要等到这个线程中任务执行完毕才进行下一步的任务
2:串行队列+异步执行
- (void)gcdTest { dispatch_queue_t q = dispatch_queue_create("yzq.gsctest", DISPATCH_QUEUE_SERIAL); NSLog(@"S--%@",[NSThread currentThread]); dispatch_async(q, ^{ NSLog(@"sync--%@",[NSThread currentThread]); }); NSLog(@"E--%@",[NSThread currentThread]);}
我们来看打印结果:
2018-04-08 15:38:55.435107+0800 Test180403[2340:155472] S--<NSThread: 0x604000076b00>{number = 1, name = main}2018-04-08 15:38:55.435392+0800 Test180403[2340:155472] E--<NSThread: 0x604000076b00>{number = 1, name = main}2018-04-08 15:38:55.435412+0800 Test180403[2340:155537] sync--<NSThread: 0x604000462380>{number = 3, name = (null)}
分析:
我们创建了一个串行的一个队列,首先在主线程中打印了S,然后往这个队列中添加了一个异步的任务,但是此时也只是添加进去了并没有立即执行这个线程,当主线程的任务执行完毕了才会取出主线程中的异步队列进行执行.
3.并行队列+同步执行 DISPATCH_QUEUE_CONCURRENT为并行队列
- (void)gcdTest { dispatch_queue_t q = dispatch_queue_create("yzq.gsctest", DISPATCH_QUEUE_CONCURRENT); NSLog(@"S--%@",[NSThread currentThread]); dispatch_sync(q, ^{ NSLog(@"sync--%@",[NSThread currentThread]); }); NSLog(@"E--%@",[NSThread currentThread]);}
看看打印结果:
2018-04-08 15:46:10.614840+0800 Test180403[2432:159361] S--<NSThread: 0x60400006da40>{number = 1, name = main}2018-04-08 15:46:10.615052+0800 Test180403[2432:159361] sync--<NSThread: 0x60400006da40>{number = 1, name = main}2018-04-08 15:46:10.615169+0800 Test180403[2432:159361] E--<NSThread: 0x60400006da40>{number = 1, name = main}
分析:
我们创建了一个并行的队列,刚开始会在主线程中打印S 然后往这个并行队列中添加了一个同步任务,此时主线程在执行dispatch_sync方法后阻塞了当前线程,去等待dispatch_sync方法里面的block执行完毕,等到所有同步任务执行完毕后,才去执行后面的操作,所有的打印都是在主线程完成的。
4:并行队列+异步执行
- (void)gcdTest { dispatch_queue_t q = dispatch_queue_create("yzq.gsctest", DISPATCH_QUEUE_CONCURRENT); NSLog(@"S--%@",[NSThread currentThread]); dispatch_async(q, ^{ NSLog(@"async--%@",[NSThread currentThread]); }); NSLog(@"E--%@",[NSThread currentThread]);}
看看打印结果:
2018-04-08 15:52:59.861249+0800 Test180403[2503:162803] S--<NSThread: 0x600000078180>{number = 1, name = main}2018-04-08 15:52:59.861584+0800 Test180403[2503:162803] E--<NSThread: 0x600000078180>{number = 1, name = main}2018-04-08 15:52:59.861603+0800 Test180403[2503:162867] async--<NSThread: 0x604000279340>{number = 3, name = (null)}
分析一下:
首先创建了一个并行的队列,打印S,然后往这个并行队列中添加了一个异步线程,但是并没有立即执行,当主线程任务执行完毕之后再从并行队列中依次开辟线程来执行操作.
相关文章推荐
- iOS gcd 串行,并行,同步,异步代码研究
- ios使用GCD来执行同步或异步串行、并行操作。
- IOS多线程知识总结/队列概念/GCD/主队列/并行队列/全局队列/主队列/串行队列/同步任务/异步任务区别(附代码)
- iOS中多线程知识总结:进程、线程、GCD、串行队列、并行队列、全局队列、主线程队列、同步任务、异步任务等
- iOS GCD, 同步,异步,串行队列,并行队列,dispatch_group
- iOS中多线程知识总结:进程、线程、GCD、串行队列、并行队列、全局队列、主线程队列、同步任务、异步任务等
- iOS中多线程知识总结:进程、线程、GCD、串行队列、并行队列、全局队列、主线程队列、同步任务、异步任务等(有示例代码)
- 【iOS开发-91】GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例
- iOS学习笔记74-IOS多线程知识总结/队列概念/GCD/主队列/并行队列/全局队列/主队列/串行队列/同步任务/异步任务区别附代码
- 【iOS开发-91】GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例
- 理解 iOS 开发中 GCD 相关的同步(synchronization)\ 异步(asynchronization),串行(serial)\ 并行(concurrency)概念
- GCD使用 串行并行队列 与 同步异步执行的各种组合 及要点分析
- ios-day19-02(GCD介绍。串行队列、并行队列、全局队列、主队列、同步任务、异步任务)
- iOS-GCD学习之同步异步线程去执行串行操作
- GCD网络多线程---同步执行,异步执行,串行队列,并行队列
- 多线程GCD+同步执行+异步执行+并行执行+串行执行+重复、分组、延迟、障碍方法
- iOS GCD/主队列/并行队列/全局队列/串行队列/同步任务/异步任务区别 含代码
- IOS多线程知识总结/队列概念/GCD/主队列/并行队列/全局队列/主队列/串行队列/同步任务/异步任务区别
- IOS多线程知识总结/队列概念/GCD/主队列/并行队列/全局队列/主队列/串行队列/同步任务/异步任务区别(附代码)
- GCD使用 串行并行队列 与 同步异步执行的各种组合 及要点分析