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]);

运行结果例如以下


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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTA1ODczMg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">


     并发队列:
并发队列能够让多个觉得女巫并发(同一时候)运行,它会自己主动开启多个线程同一时候运行任务,并发功能仅仅有在异步函数下才会有效,比如有例如以下代码,并行队列下运行同步任务:
// 1. 队列
dispatch_queue_t q = dispatch_queue_create("bingXing", DISPATCH_QUEUE_CONCURRENT); // 2. 同步运行
for (int i = 0; i < 10; ++i) {
dispatch_sync(q, ^{
NSLog(@"%@ %d", [NSThread currentThread], i);
});
} NSLog(@"come here - %@",[NSThread currentThread]);

结果例如以下


并发队列下运行同步函数不会创建新线程,全部任务依次在主线程上运行。
再看看并发队列下运行异步函数
// 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]);

执行结果例如以下:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTA1ODczMg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

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





ios多线程操作(五)—— GCD串行队列与并发队列的更多相关文章

  1. iOS多线程开发之GCD(中篇)

    前文回顾: 上篇博客讲到GCD的实现是由队列和任务两部分组成,其中获取队列的方式有两种,第一种是通过GCD的API的dispatch_queue_create函数生成Dispatch Queue:第二 ...

  2. iOS多线程开发之GCD(中级篇)

    前文回顾: 上篇博客讲到GCD的实现是由队列和任务两部分组成,其中获取队列的方式有两种,第一种是通过GCD的API的dispatch_queue_create函数生成Dispatch Queue:第二 ...

  3. iOS多线程知识总结--GCD

    iOS多线程知识总结--GCD 1. iOS中苹果提供4钟方案来帮助我们实现多线程: (1) 纯C语言的pthread,偏底层,需要程序员手动管理线程的生命周期,基本不用. (2) OC语言的NSTr ...

  4. iOS 多线程:『GCD』详尽总结

    本文用来介绍 iOS 多线程中 GCD 的相关知识以及使用方法.这大概是史上最详细.清晰的关于 GCD 的详细讲解+总结的文章了.通过本文,您将了解到: 1. GCD 简介 2. GCD 任务和队列 ...

  5. iOS多线程开发之GCD(基础篇)

    总纲: GCD基本概念 GCD如何实现 GCD如何使用 队列和任务组合 一.GCD基本概念 GCD 全称Grand Central Dispatch(大中枢队列调度),是一套低层API,提供了⼀种新的 ...

  6. iOS多线程编程之GCD的常见用法(转载)

    一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) withObject:nil aft ...

  7. iOS多线程开发之GCD(死锁篇)

    上篇和中篇讲解了什么是GCD,如何使用GCD,这篇文章将讲解使用GCD中将遇到的死锁问题.有兴趣的朋友可以回顾<iOS多线程开发之GCD(上篇)>和<iOS多线程开发之GCD(中篇) ...

  8. IOS多线程知识总结/队列概念/GCD/串行/并行/同步/异步

    进程:正在进行中的程序被称为进程,负责程序运行的内存分配;每一个进程都有自己独立的虚拟内存空间: 线程:线程是进程中一个独立的执行路径(控制单元);一个进程中至少包含一条线程,即主线程. 队列:dis ...

  9. OC 线程操作 - GCD使用 -同步函数,异步函数,串行队列,并发队列

    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ // GCD 开几条线程并不是我们 ...

随机推荐

  1. EasyUI - DateBox组件

    效果: html代码: <input type ="text" id ="box" /> JS代码: $(function () { //设置返回格 ...

  2. 重操JS旧业第二弹:数据类型与类型转换

    一 数据类型 1 js中的数据类型 1.1 数据类型列举 1)number类型 2)boolean类型 3)string类型 4)对象类型 5)函数类型 6)undefined类型 1.2 数据类型获 ...

  3. <input type=button> 跳转页面

    打开新页面 标题" type="button" onclick='window.open("bedzhao.aspx")' /> 转换本页面 标 ...

  4. View实现涂鸦、撤销以及重做功能

    import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import j ...

  5. 译文:前端性能的重要性 The Importance of Frontend Performance

    欢迎訪问我的主页.最新的文章我会首先公布在个人主页上: http://blog.guaidm.com/shocky/ 原书下载地址:http://pan.baidu.com/s/1pJocRwB 在我 ...

  6. linux中怎样设置dhcpd

    linux中怎样设置DHCP  在 linux 以下设置 DHCP一点也不复杂﹐您全部要做的仅仅有一个文件﹕/etc/dhcpd.conf . 以下﹐我用我自己的设置文件来说说怎么改动这个文件﹕  d ...

  7. C++学习之路—继承与派生(三):多重继承与虚基类

    (根据<C++程序设计>(谭浩强)整理,整理者:华科小涛,@http://www.cnblogs.com/hust-ghtao转载请注明) 多重继承是指一个派生类有两个或多个基类.例如,有 ...

  8. Indy10.2.5的危险做法

    为了排查一个Bug今天无意看了看Indy源码,结果吓了一跳.TIdIOHandler.ReadLongWord函数用于读取通讯数据并转换成LongWord类型返回,它做用了一种危险的做法可能会导致数据 ...

  9. 基于Hadoop技术实现的离线电商分析平台(Flume、Hadoop、Hbase、SpringMVC、highcharts)

    离线数据分析平台是一种利用hadoop集群开发工具的一种方式,主要作用是帮助公司对网站的应用有一个比较好的了解.尤其是在电商.旅游.银行.证券.游戏等领域有非常广泛,因为这些领域对数据和用户的特性把握 ...

  10. POJ 3619 Speed Reading(简单题)

    [题意简述]:有K头牛,N页书,每次第i头牛每分钟仅仅能读Si页书,连续读Ti分钟,之后歇息Ri分钟.如今问我们第i头牛花费多少时间能够读完这N页书. [分析]:简单的模拟 //220K 32Ms # ...