一、简介:

  Grand Central Dispatch (GCD)是Apple开发的一个多核编程的较新的解决方法。它主要用于优化应用程序以支持多核处理器以及其他对称多处理系统。它是一个在线程池模式的基础上执行的并行任务。在Mac OS X 10.6雪豹中首次推出,也可在IOS 4及以上版本使用。

GCD是一个替代诸如NSThread等技术的很高效和强大的技术。GCD完全可以处理诸如数据锁定和资源泄漏等复杂的异步编程问题。GCD的工作原理是让一个程序,根据可用的处理资源,安排他们在任何可用的处理器核心上平行排队执行特定的任务。这个任务可以是一个功能或者一个程序段。

GCD仍然在一个很低的水平使用线程,但是它不需要程序员关注太多的细节。GCD创建的队列是轻量级的,苹果声明一个GCD的工作单元需要由15个指令组成。也就是说创造一个传统的线程很容易的就会需要几百条指令。

  GCD中的一个任务可被用于创造一个被放置于队列的工作项目或者事件源。如果一个任务被分配到一个事件源,那么一个由功能或者程序块组成的工作单元会被放置于一个适当的队列中。苹果公司认为GCD相比于普通的一个接一个的执行任务的方式更为有效率。(来自百科)

  二、队列

  GCD的所有的调度队列都是先进先出队列,因此,队列中的任务的开始的顺序和添加到队列中的顺序相同。我们可以将部分独立运行的任务添加到对列,由系统管理执行。

  GCD队列主要有三种,系统主队列 main_queue、全局并发队列 global_queue和自定义队列

  • 并发队列     队列中的任务必须在前一个任务开始后才能执行
  1. 同步串行队列:队列的执行任务与主线程是同步的,会阻塞主线程
  2. 异步串行队列:队列的执行任务与主线程是异步的
  • 串行队列     队列中的任务必须在前一个任务结束后才能执行(可替代线程锁)
  1. 同步串行队列:队列的执行任务与主线程是同步的,会阻塞主线程
  2. 异步串行队列:队列的执行任务与主线程是异步的

  三、队列的创建

  1. 自定义串行队列,提交同步任务

     //1.创建串行队列、提交同步任务dispatch_queue_t queue = dispatch_queue_create("queueName", DISPATCH_QUEUE_SERIAL);dispatch_sync(queue, ^{//code 任务一});dispatch_sync(queue, ^{//code 任务二});
    

      队列中的任务是同步出列的,任务一执行结束后执行任务二。这种类型的任务与主线程是同步的,会阻塞主线程

  2. 自定义串行队列,提交异步任务

    //1.创建串行队列、提交异步任务dispatch_queue_t queue = dispatch_queue_create("queueName", DISPATCH_QUEUE_SERIAL);dispatch_async(queue, ^{//code 任务一});dispatch_async(queue, ^{//code 任务二});
    

      队列的任务是同步出列,任务一执行结束后执行任务二。该类型的任务与主线程是并发执行的,不会阻塞主线程 

  3. 自定义并行队列,提交同步任务

    // 创建并行队列、提交同步任务dispatch_queue_t queue = dispatch_queue_create("queueName", DISPATCH_QUEUE_CONCURRENT);dispatch_async(queue, ^{//code 任务一});dispatch_async(queue, ^{//code 任务二});
    

      队列的任务是异步出列,任务的出列顺序按先进先出的顺序执行,既任务一出列后任务二接着出列(任务一与任务二又是同步的),与主线程同步,会阻塞主线程

  4. 自定义并行队列,提交异步任务

    //创建并行队列、提交异步任务dispatch_queue_t queue = dispatch_queue_create("queueName", DISPATCH_QUEUE_CONCURRENT);dispatch_async(queue, ^{//code 任务一});dispatch_async(queue, ^{//code 任务一});
    

      任务一出列后任务二才可以出列,各任务之间是异步的,不会阻塞主线程

  5. 在主队列提交同步任务
    //在主队列提交同步任务dispatch_sync(dispatch_get_main_queue(), ^{//code});
    

      阻塞主线程

  6. 在主队列提交异步任务
    //在主队列提交异步任务dispatch_async(dispatch_get_main_queue(), ^{//code任务});
    

      

  7. 在全局队列提交同步任务
     //在全局队列提交同步任务dispatch_sync(dispatch_get_global_queue(0, 0), ^{//code});
    

      

  8. 在全局队列提交异步任务
    //在全局队列提交异步任务dispatch_async(dispatch_get_global_queue(0, 0), ^{//code});
    

      

    dispatch_get_gloabal_queue 的第一个参数为枚举类型(默认为0),决定任务的优先级 ,第二个参数为Apple保留参数,传0
    #define DISPATCH_QUEUE_PRIORITY_HIGH        2
    #define DISPATCH_QUEUE_PRIORITY_DEFAULT     0
    #define DISPATCH_QUEUE_PRIORITY_LOW         (-2)
    #define DISPATCH_QUEUE_PRIORITY_BACKGROUND  INT16_MIN(后台任务,优先级最低)

  四、总结

    队列的类型决定了队列任务的执行方式(主队列是一个串行队列)。一般把会阻塞主线程的任务提交到异步并行队列当中。

转载于:https://www.cnblogs.com/wxh839/p/4575303.html

GCD中的队列与任务相关推荐

  1. jQuery中的队列是什么?

    我发现queue() / dequeue()上的jQuery.com文档太简单了. jQuery中的队列到底是什么? 我应该如何使用它们? #1楼 它允许您将动画排队...例如,代替此 $('#my- ...

  2. 多线程中的队列不一定需要线程安全

    多线程中的队列不一定需要线程安全 两个线程,主线程中update update(){ while(queue.count >0){ //process.... queue.pop() } } 子 ...

  3. 计时器延迟 NSTimer和CADisplaylink GCD中的延迟

    1,NStimer时间间隔比较大,大于1秒: CADisplayLink 时间间隔比较小,0.01秒: 2,创建启动计时器: [NSTimer scheduledTimeInterval:0.5 ta ...

  4. java中有界队列的饱和策略(reject policy)

    文章目录 AbortPolicy DiscardPolicy DiscardOldestPolicy CallerRunsPolicy 使用Semaphore java中有界队列的饱和策略(rejec ...

  5. TCP流中各种队列:

    TCP流中各种队列: RED队列的介绍 [https://blog.csdn.net/sinat_20184565/article/details/107521549]

  6. python 消息队列 get是从队首还是队尾取东西_python分布式爬虫中消息队列知识点详解...

    当排队等待人数过多的时候,我们需要设置一个等待区防止秩序混乱,同时再有新来的想要排队也可以呆在这个地方.那么在python分布式爬虫中,消息队列就相当于这样的一个区域,爬虫要进入这个区域找寻自己想要的 ...

  7. 并发容器(J.U.C)中的队列类

    JUC包下的容器类分为两部分,一部分是并发集合类,一部分是并发队列类,其中并发集合类可以解决我们集合使用过程中的多线程并发问题,而并发队列类则主要被当做阻塞队列使用,是线程池中的关键参数之一. 文章目 ...

  8. JAVA线程池_并发队列工作笔记0002---认识线程池_在线程池中使用队列

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 上面是线程的执行周期 这个线程的生命周期,可以看到时间都浪费在了创建和销毁的这里了. 实际上执行业 ...

  9. 队列管理器连接数设置_详解!基于Redis解决业务场景中延迟队列的应用实践,你不得不服啊...

    一.业务概述 我们假定设置两个队列,一个队列维护正式工单,另一个队列维护挂起工单.对于挂起操作,我们通过Redis设置key有效时间,当key失效时,客户端监听失效事件,获取工单,实现 挂起工单队列的 ...

最新文章

  1. flash中物体运动基础之三---------摩擦力,重力,风力,推力,旋转
  2. Map+Model+ModelMap介绍
  3. mysql normsinv_在MySQL中实现NORMSINV函数
  4. python爬虫获取url_Python爬虫如何获取页面内所有URL链接?本文详解
  5. pythonopencv人脸相似度_图像相似度算法的个人见解(pythonopencv)-Go语言中文社区...
  6. 《鸟哥的Linux私房菜》学习笔记(8)——bash脚本编程之变量
  7. bt种子文件变成html,bt种子文件是什么?bt种子文件怎么用?
  8. 大一html网页制作PPT,HTML网页制作.ppt
  9. PR曲线以及ROC曲线的简单理解
  10. Android USB电源管理
  11. 地址规范化--城市三级联动(layui) (B)
  12. 汉语属于哪个语系_汉语,日语,韩语分别属于什么语系?
  13. 【Android】使用后端云Bmob实现登录、注册
  14. 一个屌丝程序员的青春(二六五)
  15. 移动互联网的未来在非洲
  16. Activiti,自定义表单,外置表单,工作流,微服务,子系统
  17. 无需公网IP,在外远程访问NAS威联通QNAP【内网穿透】
  18. Mac空格键快速预览不能用了怎么办?
  19. VMware虚拟机启动后黑屏,无论怎么按都是不动弹
  20. Apache虚拟主机示例

热门文章

  1. 提升有监督学习效果的实战解析
  2. 主体功能区规划的定位
  3. ivx中字体显示_html-中文字体在CSS中的显示(Unicode编码)(转载)
  4. 安装python缺少dll_python报错DLL load failed:找不到模块怎么解决?
  5. 程序员接私活平台_程序员去哪儿接私活?我系统总结了15个国内平台,绝对靠谱...
  6. 计算机硬件专业知识西瓜视频,2019年中电脑硬件榜单,空调西瓜+电脑助你当个快乐肥宅...
  7. 寻找连通域算法_FPGA实现的连通域识别算法升级
  8. python网络爬虫开发从入门到精通_Python突击-从入门到精通到项目实战
  9. 微信小程序实现选项卡
  10. set和muliset