美文网首页
GCD的串行和并行队列

GCD的串行和并行队列

作者: 今年27 | 来源:发表于2020-04-16 17:00 被阅读0次

今天来测试一下GCD的串行和并行队列
我一直很好奇对于dispatch_sync方法,对于这两种队列会发生什么
于是开始测试,先测试串行队列

  dispatch_queue_t Cqueue = dispatch_queue_create("queueName", DISPATCH_QUEUE_SERIAL);
          dispatch_sync(Cqueue, ^{

              [NSThread sleepForTimeInterval:3.0];
              NSLog(@"1完毕:%@", [NSThread currentThread]);
          });

          dispatch_sync(Cqueue, ^{

              [NSThread sleepForTimeInterval:2.0];
              NSLog(@"2完毕:%@", [NSThread currentThread]);
          });

          dispatch_sync(Cqueue, ^{
              [NSThread sleepForTimeInterval:3.0];
              NSLog(@"3完毕:%@", [NSThread currentThread]);
          });
结果如下 同步串行队列

很明显我们可以看到,没有开辟新的线程,直接在主线程干活

那么同步并行队列呢?

  dispatch_queue_t Cqueue = dispatch_queue_create("queueName", DISPATCH_QUEUE_CONCURRENT);
          dispatch_sync(Cqueue, ^{

              [NSThread sleepForTimeInterval:3.0];
              NSLog(@"1完毕:%@", [NSThread currentThread]);
          });

          dispatch_sync(Cqueue, ^{

              [NSThread sleepForTimeInterval:2.0];
              NSLog(@"2完毕:%@", [NSThread currentThread]);
          });

          dispatch_sync(Cqueue, ^{
              [NSThread sleepForTimeInterval:3.0];
              NSLog(@"3完毕:%@", [NSThread currentThread]);
          });
dispatch_sync并行队列

可以得到和串行队列一样的结果,所以我们可以得出结论:

结论:只要是dispatch_sync这种方式,不管是串行和并行队列都不会开辟新的线程,在当前线程中按任务顺序执行。

那么对于dispatch_async这种方式呢,我们来测试一下:

    dispatch_queue_t queue1 = dispatch_queue_create("myqueue", DISPATCH_QUEUE_CONCURRENT);
      dispatch_async(queue1, ^{
          [NSThread sleepForTimeInterval:2.0];
          NSLog(@"s1完毕:%@", [NSThread currentThread]);

      });

      dispatch_async(queue1, ^{
          [NSThread sleepForTimeInterval:2.0];
          NSLog(@"s2完毕:%@", [NSThread currentThread]);

      });

      dispatch_async(queue1, ^{
        [NSThread sleepForTimeInterval:2.0];
          NSLog(@"s3完毕:%@", [NSThread currentThread]);


      });

结果:


dispatch_async并行队列测试结果

我们可以看到dispatch_async对于并行队列的调度,对于每一个任务都会开辟一个新的线程并行。

对于串行队列呢?我们来看下

 dispatch_queue_t queue1 = dispatch_queue_create("myqueue", DISPATCH_QUEUE_SERIAL);
      dispatch_async(queue1, ^{
          [NSThread sleepForTimeInterval:2.0];
          NSLog(@"s1完毕:%@", [NSThread currentThread]);

      });

      dispatch_async(queue1, ^{
          [NSThread sleepForTimeInterval:2.0];
          NSLog(@"s2完毕:%@", [NSThread currentThread]);

      });

      dispatch_async(queue1, ^{
        [NSThread sleepForTimeInterval:2.0];
          NSLog(@"s3完毕:%@", [NSThread currentThread]);


      });

结果:


dispatch_async对于串行的结果

可以很明显的看到对于所有任务只开辟了一条新的线程,异步于主线程来串行执行任务。

结论:对于dispatch_async, 对于并行队列多个任务会开启多个线程来并发执行。对于串行队列只会创建一个新的线程来同步执行。

相关文章

  • 关于多线程GCD 串行/并行、同步/异步

    一、GCD串行/并行队列创建 串行队列: 并行队列: 二、GCD串行/并行队列同步/异步执行 执行内容1: 执行结...

  • GCD死锁

    GCD死锁原因 GCD死锁的原因是队列阻塞,而不是线程阻塞! 串行和并行 串行和并行都是相对于队列而言的-队列(负...

  • GCD多线程问题整理

    1.GCD队列有哪几种类型?有哪几种队列? GCD队列分为串行队列、并行队列两种类型;队列有主串行队列、全局并行队...

  • IOS多线程总结

    目录 简述 NSThread GCD操作与队列异步操作并行队列同步操作并行队列同步操作串行队列异步操作串行队列队列...

  • iOS开发中GCD普遍使用

    1.全局队列和主队 2.串行队列和并行队列 串行队列 并行队列 3.多个线程子任务完成后再执行某一个任务,GCD线...

  • GCD简单实现

    GCD实现1,2并行和3串行和45串行,4,5是并行。即3依赖1,2的执行,45依赖3的执行。 串行队列:队列中的...

  • 多线程之GCD

    GCD的队列分为串行队列和并行队列两类: 串行队列:只有一个线程,加入到队列中的操作按添加顺序依次执行。并发队列:...

  • AFNetworking 中 GCD 的使用(5)

    GCD in AFNetworking 的使用 AFImageDownloader 图片下载 创建队列,串行,并行...

  • iOS - GCD

    GCD队列 串行队列 并行队列 全局队列 主队列 几个容易混淆的概念dispatch_barrier_async栅...

  • iOS开发笔记-多线程的使用方法

    多线程方式一:GCD队列的3个种类: 自建队列: 分并行/串行 全局队列: 属于并行队列, 是系统默认创建的. 主...

网友评论

      本文标题:GCD的串行和并行队列

      本文链接:https://www.haomeiwen.com/subject/qchdvhtx.html