GCD的串行和并行队列

2020-04-16  本文已影响0人  今年27

今天来测试一下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, 对于并行队列多个任务会开启多个线程来并发执行。对于串行队列只会创建一个新的线程来同步执行。
上一篇 下一篇

猜你喜欢

热点阅读