美文网首页
GCD串行队列与并发队列

GCD串行队列与并发队列

作者: zfl1024 | 来源:发表于2017-11-06 19:12 被阅读0次

GCD的队列可以分为2大类型:串行队列、并发队列。
一: 串行队列(Serial Dispatch Queue):
一次只调度一个任务,队列中的任务一个接着一个地执行(一个任务执行完毕后,再执行下一个任务)
创建一个队列:

dispatch_queue_t   q  =  dispatch_queue_create(const char *label, dispatch_queue_attr_t attr)

参数:
const char *label:队列的名称
dispatch_queue_attr_t attr:队列的属性,属性有两个,分别为:
DISPATCH_QUEUE_SERIAL(NULL)
串行队列
DISPATCH_QUEUE_CONCURRENT
并发队列
队列属性为宏,其中串行队列的宏值为NULL,所以创建一个串行队列可以用如下代码:

 dispatch_queue_t q = dispatch_queue_create(“chuanXing",   NULL);

一个串行的异步任务演示如下:

for ( int  i = 0 ; i <  10; ++i) {
 // 10 个异步
 dispatch_async(q, ^{  
      NSLog(@“%@ - %d", [NSThread  currentThread],i);
  });  
}  
 NSLog(@"come here - %@“, [NSThread currentThread]);

执行结果如下:

20150319214938531.png

主线程执行时间并不确定,但将10个异步任务添加的串行队列中,无论如何都会依次一个一个执行,而且只会开启一条线程。
如果将任务改为同步任务,那么运行结果可想而知(同步任务的特性)


20150319215137171.png

二、并发队列:
并发队列可以让多个任务并发(同时)执行,它会自动开启多个线程同时执行任务,并发功能只有在异步函数下才会有效,例如有如下代码,并行队列下执行同步任务:

 // 1. 队列
 dispatch_queue_t q = dispatch_queue_create("zfl", DISPATCH_QUEUE_CONCURRENT);
 // 2. 同步执行
for(int  i = 0 ; i < 10 ; ++i) {
  dispatch_sync(q, ^{  
  NSLog( @"%@ %d" , [NSThread  currentThread ], i);
  });  

}  
 NSLog(@"come here - %@" ,[NSThread currentThread]);

结果如下:


20150319215209183.png

并发队列下执行同步函数不会创建新线程,所有任务依次在主线程上执行。
再看看并发队列下执行异步函数:

// 1. 队列
dispatch_queue_t q = dispatch_queue_create("itheima", DISPATCH_QUEUE_CONCURRENT);
 // 2. 同步执行
  for ( int i = 0 ; i <  10 ; ++i) {
      dispatch_async(q, ^{  
 NSLog(@"%@ %d" , [NSThread currentThread ], i);
 }); 
 }  
NSLog(@"come here - %@",[NSThread currentThread ]);

运行结果如下:


20150319215241178.png

由此可知并行队列下地异步函数会开启N条子线程,且执行任务的顺序我们无法控制,至于是哪条线程执行任务由队列决定,哪个任务先完成由CPU决定。结果中number = 4和number = 2的子线程执行了多次任务,那是因为这两条线程执行完任务就会被线程池回收,队列再从线程池中去线程执行任务,这时就会线程重复利用,如果没有线程则会重新创建。

相关文章

  • GCD队列使用

    使用GCD前,先对队列总结一下: 串行和并发 GCD中队列分为两种:串行队列、并发队列。串行队列:任务按在队列里的...

  • GCD串行并发队列

    学习完本篇,您会对以下知识点更加理解: 队列 串行队列 并发队列 GCD全局队列 GCD主队列 创建串行队列 创建...

  • 2021--- GCD

    gcd同步,异步,串行队列,并发队列,全局队列,主队列,以及死锁。 1、gcd队列阻塞问题[https://www...

  • GCD串行队列与并发队列

    GCD的队列可以分为2大类型:串行队列、并发队列。一: 串行队列(Serial Dispatch Queue):一...

  • 关于GCD总结

    什么是GCD 理解串行、并发及同步异步 串行和并发 同步和异步 队列 串行队列 两者等效.2)使用主队列(在主队列...

  • iOS - 多线程(二) GCD讲解

    目录: 1.GCD简介2.串行队列 + 同步执行3.串行队列 + 异步执行4.并发队列 + 同步执行5.并发队列 ...

  • 多线程

    iOS中的几种多线程GCD1、GCD分为任务和队列,任务(同步,异步)队列(串行,并发),同步串行,同步主队列的情...

  • GCD篇(1)

    GCD的队列有两种,一种是串行队列,一种是并发队列。 并行与并发的区别 并发(concurrency) 并行(pa...

  • 队列dispatch_queue的使用

    队列分为:串行队列、并发队列和主队列,主队列也叫特殊串行队列,是GCD自带的。 任务的执行分为:同步执行和异步执行...

  • iOS 网络开发

    多线程 NSThread GCD队列并发队列全局队列自己创建串行队列自己创建主队列任务:block函数sync:同...

网友评论

      本文标题:GCD串行队列与并发队列

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