当前位置:   article > 正文

GCD 串行队列、并发队列以及同步执行、异步执行_gcd'串行队列 同步

gcd'串行队列 同步
         GCD中的队列主要有两种,串行队列和并行队列。
  

         串行队列: 调度任务到串行队列,任务将在同一个线程执行,并且顺序执行。

         并行队列:调度任务到并行队列, 将开启多个线程,任务执行结束的顺序无法确定。

         调度任务到队列的方式也主要有两种,dispatch_sync同步调度和dispatch_async异步调度。

         dispatch_sync 任务将在当前线程执行。若同步调度任务到并发队列上,则所有任务在当前线程顺序执行。dispatch_sync任务到串行队列并不一定会死锁。只有将任务同步调度到当前代码所在的队列, 才会死锁。

         dispatch_async 如果调度到同一个并行队列上, 将开多个新线程执行,任务乱序执行。

         dispatch_async 如果调度到同一个串行队列上,第一次异步调度时会开启一个新线程,后续异步调度会在第一次创建的线程上运行,但肯定会顺序执行。

        请看下述代码执行结果:

  1. dispatch_queue_t serialQueue= dispatch_queue_create("串行队列", DISPATCH_QUEUE_SERIAL);
  2. dispatch_queue_t concurrentQueue=dispatch_queue_create("并行队列", DISPATCH_QUEUE_CONCURRENT);
  3. dispatch_queue_t mainQueue=dispatch_get_main_queue();
  4. dispatch_queue_t globalQueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
  5. //1:同步调度任务到串行队列中,在主线程下串行执行
  6. for(int i=0;i<10;i++){
  7. dispatch_sync(serialQueue, ^{
  8. NSLog(@"任务执行中....-%d\n mainThread:%@",i,[NSThread currentThread]);
  9. });
  10. }
  11. //2:同步调度任务到并行队列中,在主线程下串行执行
  12. for(int i=0;i<10;i++){
  13. dispatch_sync(concurrentQueue, ^{
  14. NSLog(@"任务执行中....-%d\n mainThread:%@",i,[NSThread currentThread]);
  15. });
  16. }
  17. //结果:
  18. //3:同步调度任务到主队列中,锁死
  19. for(int i=0;i<10;i++){
  20. dispatch_sync(mainQueue, ^{
  21. NSLog(@"任务执行中....-%d\n mainThread:%@",i,[NSThread currentThread]);
  22. });
  23. }
  24. //4:同步调度任务到全局队列中,在主线程下串行执行
  25. for(int i=0;i<10;i++){
  26. dispatch_sync(globalQueue, ^{
  27. NSLog(@"任务执行中....-%d\n mainThread:%@",i,[NSThread currentThread]);
  28. });
  29. }
  30. //5:异步调度任务到串行队列中,开启一个子线程,所有任务在该线程中串行执行
  31. for(int i=0;i<10;i++){
  32. dispatch_async(serialQueue, ^{
  33. NSLog(@"任务执行中....-%d\n mainThread:%@",i,[NSThread currentThread]);
  34. });
  35. }
  36. //6:异步调度任务到并行队列中,开启多个子线程,任务并行执行
  37. for(int i=0;i<10;i++){
  38. dispatch_async(concurrentQueue, ^{
  39. NSLog(@"任务执行中....-%d\n mainThread:%@",i,[NSThread currentThread]);
  40. });
  41. }
  42. //结果:
  43. //7:异步调度任务到主队列中,在主线程中串行执行
  44. for(int i=0;i<10;i++){
  45. dispatch_async(mainQueue, ^{
  46. NSLog(@"任务执行中....-%d\n mainThread:%@",i,[NSThread currentThread]);
  47. });
  48. }
  49. //8:异步调度任务到全局队列中,开启多个子线程,在多个子线程中并行执行
  50. for(int i=0;i<10;i++){
  51. dispatch_async(globalQueue, ^{
  52. NSLog(@"任务执行中....-%d\n mainThread:%@",i,[NSThread currentThread]);
  53. });
  54. }

         再看一个更复杂的例子:

  1. - (void)viewDidLoad {
  2. // 默认创建串行队列
  3. dispatch_queue_t queue = dispatch_queue_create("Dan", NULL);
  4. dispatch_sync(queue, ^{
  5. // block 0 //在主线程执行,但不会死锁
  6. NSLog(@"current 0: %@", [NSThread currentThread]);
  7. //在queue的执行体中同步调度另一个任务到queque, 死锁
  8. dispatch_sync(queue, ^{
  9. // block 00
  10. NSLog(@"current 00: %@", [NSThread currentThread]);
  11. });
  12. });
  13. // dispatch_async开启一个子线程
  14. dispatch_async(queue, ^{
  15. NSLog(@"current : %@", [NSThread currentThread]);
  16. dispatch_queue_t serialQueue = dispatch_queue_create("Dan-serial", DISPATCH_QUEUE_SERIAL);
  17. /*同步调度任务到串行队列"Dan-serial", 由于当前代码所在队列为"Dan"这个队列,
  18. *两个队列并不相同,因此不会死锁
  19. */
  20. dispatch_sync(serialQueue, ^{
  21. // block 1
  22. NSLog(@"current 1: %@", [NSThread currentThread]);
  23. });
  24. dispatch_sync(serialQueue, ^{
  25. // block 2
  26. NSLog(@"current 2: %@", [NSThread currentThread]);
  27. });
  28. //异步调度到串行队列,开启新线程,但任务顺序执行
  29. dispatch_async(serialQueue, ^{
  30. // block 3
  31. NSLog(@"current 3: %@", [NSThread currentThread]);
  32. });
  33. dispatch_async(serialQueue, ^{
  34. // block 4
  35. NSLog(@"current 4: %@", [NSThread currentThread]);
  36. });
  37. });
  38. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/691465
推荐阅读
相关标签
  

闽ICP备14008679号