1、GCD-同步执行多线程时          GCD中不管向什么类型的队列加同步任务,实际上都会加到当前线程中(一般为主线程)。

2、GCD-异步执行多线程时          GCD中不管向什么类型的队列加同步任务,实际上都会加到新开辟的新线程中(不是主线程)。

举例如下:通过演示线程地址来佐证上述观点.......

情况一:GCD-同步   GCD中向并行队列加同步任务,实际上都会加到当前线程中。

    //当前主线程NSLog(@"当前线程:%@",[NSThread currentThread]);//获取一个全局的并行队列dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); //同步添加任务dispatch_sync(queue, ^{NSLog(@"任务1,当前线程:%@",[NSThread currentThread]);});dispatch_sync(queue, ^{NSLog(@"任务2,当前线程:%@",[NSThread currentThread]);});

运行结果如下:可以看出这些任务都被加到了mian主线程中,这是所谓的多线程执行成为单一线程执行。

2015-10-08 17:41:12.652 01-GCD-sync[4240:234415] 当前线程:<NSThread: 0x7fba88d16870>{number = 1, name = main}
2015-10-08 17:41:12.652 01-GCD-sync[4240:234415] 任务1,当前线程:<NSThread: 0x7fba88d16870>{number = 1, name = main}
2015-10-08 17:41:12.653 01-GCD-sync[4240:234415] 任务2,当前线程:<NSThread: 0x7fba88d16870>{number = 1, name = main}

====================================================================

情况二:GCD-同步   GCD中向串行队列加同步任务,实际上都会加到当前线程中。

    //当前主线程NSLog(@"当前线程:%@",[NSThread currentThread]);// 创建一个自定义的串行队列dispatch_queue_t myqueue = dispatch_queue_create("myqueue", DISPATCH_QUEUE_CONCURRENT);//同步添加任务dispatch_sync(myqueue, ^{NSLog(@"任务1,当前线程:%@",[NSThread currentThread]);});dispatch_sync(myqueue, ^{NSLog(@"任务2,当前线程:%@",[NSThread currentThread]);});

运行结果如下:可以看出这些任务都被加到了main主线程中,这是所谓的多线程执行成为单一线程执行。

2015-10-08 18:27:27.316 01-GCD-sync[4563:251855] 当前线程:<NSThread: 0x7f8633d14370>{number = 1, name = main}
2015-10-08 18:27:27.317 01-GCD-sync[4563:251855] 任务1,当前线程:<NSThread: 0x7f8633d14370>{number = 1, name = main}
2015-10-08 18:27:27.317 01-GCD-sync[4563:251855] 任务2,当前线程:<NSThread: 0x7f8633d14370>{number = 1, name = main}

====================================================================

情况三:GCD-异步  GCD中向并行队列加同步任务,实际上都会加到新开辟的新线程中。

    //当前主线程NSLog(@"当前线程:%@",[NSThread currentThread]);

//获取一个全局的并行队列

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

//异步开启一个新的线程dispatch_async(queue, ^{//新线程NSLog(@"新的线程:%@",[NSThread currentThread]);//在向新线程同步添加任务dispatch_sync(queue, ^{NSLog(@"任务3,当前线程:%@",[NSThread currentThread]);});dispatch_sync(queue, ^{NSLog(@"任务4,当前线程:%@",[NSThread currentThread]);});});

运行结果如下:可以看出此时有两个线程,一个main主线程,一个没名字null的新线程。而这些任务都被加到了新的线程中,两个线程异步执行。

2015-10-08 18:40:09.615 01-GCD-sync[4658:258154] 当前线程:<NSThread: 0x7fcf43f0e750>{number = 1, name = main}
2015-10-08 18:40:09.616 01-GCD-sync[4658:258301] 新的线程:<NSThread: 0x7fcf43c426e0>{number = 2, name = (null)}
2015-10-08 18:40:09.616 01-GCD-sync[4658:258301] 任务3,当前线程:<NSThread: 0x7fcf43c426e0>{number = 2, name = (null)}
2015-10-08 18:40:09.617 01-GCD-sync[4658:258301] 任务4,当前线程:<NSThread: 0x7fcf43c426e0>{number = 2, name = (null)}

====================================================================

情况四:GCD-异步  GCD中向串行队列加同步任务,实际上都会加到新开辟的新线程中。

       //当前主线程NSLog(@"当前线程:%@",[NSThread currentThread]);// 创建一个自定义的串行队列dispatch_queue_t myqueue = dispatch_queue_create("myqueue", DISPATCH_QUEUE_CONCURRENT);//异步开启一个新的线程dispatch_async(myqueue, ^{//新线程NSLog(@"新线程:%@",[NSThread currentThread]);//在向新线程同步添加任务dispatch_sync(myqueue, ^{NSLog(@"任务3,当前线程:%@",[NSThread currentThread]);});dispatch_sync(myqueue, ^{NSLog(@"任务4,当前线程:%@",[NSThread currentThread]);});});

运行结果如下:情况一样,可以看出此时有两个线程,一个main主线程,一个没名字null的新线程。而这些任务都被加到了新的线程中,两个线程异步执行。

2015-10-08 18:43:49.023 01-GCD-sync[4695:259834] 当前线程:<NSThread: 0x7ffec3f07ca0>{number = 1, name = main}
2015-10-08 18:43:49.024 01-GCD-sync[4695:259921] 新线程:<NSThread: 0x7ffec3e18180>{number = 2, name = (null)}
2015-10-08 18:43:49.024 01-GCD-sync[4695:259921] 任务3,当前线程:<NSThread: 0x7ffec3e18180>{number = 2, name = (null)}
2015-10-08 18:43:49.025 01-GCD-sync[4695:259921] 任务4,当前线程:<NSThread: 0x7ffec3e18180>{number = 2, name = (null)}

转载于:https://www.cnblogs.com/XYQ-208910/p/4861873.html

iOS:对GCD中 同步、异步、并行、串行的见解相关推荐

  1. 计算机网络之物理层:1、接口特性、同步异步、串行并行、双工

    物理层:1.物理层相关概念 思维导图:(学习任务) 接口特性: 数据通信基础: 设计数据通信系统要考虑的三个问题: 三种通信方式: 串行.并行传输: 同步.异步传输: 思维导图:(学习任务) 接口特性 ...

  2. 如何理解vue中 同步异步

    如何理解vue中 同步异步 同步异步 , 举个例子来说,一家餐厅吧来了5个客人,同步的意思就是说,来第一个点菜,点了个鱼,好, 厨师去捉鱼杀鱼,过了半小时鱼好了给第一位客人,开始下位一位客人,就这样一 ...

  3. FPGA之VGA转HDMI之并行串行转换模块编写

            上节我们使用编码模块可解决图像数据的编码问题,而这次使用的并行转串行模块的主要功能就是实现并行串行转换.单端信号转差分信号.单沿采样转双沿采样.         并行转串行模块框图如下 ...

  4. iOS GCD, 同步,异步,串行队列,并行队列,dispatch_group

    同步,指代码在同一个线程运行 异步,代码在另一个线程运行 串行队列,提交到该队列的block会顺序执行 并行队列,提交到该队列的block会并发执行 如果想等某一队列中所有block都执行完了在执行一 ...

  5. 同步、异步 与 串行、并行的区别

    同步.异步: 指的是能否开启新的线程.同步不能开启新的线程,异步可以. 串行.并行: 指的是任务的执行方式.串行是指多个任务时,各个任务按顺序执行,完成一个之后才能进行下一个.并行指的是多个任务可以同 ...

  6. promise异步请求串行异步then并行异步all竞争异步race 传递参数resolve(then)reject(catch)

    1.印象 古人云:"君子一诺千金",这种"承诺将来会执行"的对象在JavaScript中称为Promise对象. Promise就是解决多个异步请求的问题 Pr ...

  7. py编程技巧-2.5-如何在一个for语句中迭代多个可迭代队象(并行串行)?

    实际案例: 某班学生期末考试成绩,语文,数学,英语分布存储在三个列表当中 同时迭代三个列表,计算每个学生的总分 某年级有四个班,某次考试每班英语成绩分布存储在4个列表中,依次迭代每个列表,统计全年级成 ...

  8. protues仿真中12864液晶屏串行编程的感想(从实际硬件驱动芯片 ST7565R到仿真硬件驱动芯片SED1565)

    因为疫情的原因,没办法回学校拿毕业设计,自然也就没办法调试,虽然硬件电路都搭好了,但没法调试也就意味着不知道程序编写是否有问题,所以就想着在protues上把硬件电路搭起来调试程序,因为单片机用的是s ...

  9. promise实现多个请求并行串行执行

    早上查资料,偶然发现这个话题,发现自己并不会,于是乎,下来研究了一下. 想想之前我们用jquery写请求的时候,要实现请求的串行执行,我们可能是这么做的. $.ajax({url: '',data: ...

  10. java并发 并行 串行

    并发: 并发是指允许多个任务互相干扰,在一个时间点上,只有一个任务在执行.交叉时间段只能选择一个任务来完成. 并行: 并行是在同一时刻互不干扰的进行任务.多个事件在同一时刻发生 串行: 串行在时间上不 ...

最新文章

  1. Structured Streaming编程 Programming Guide
  2. Linux内核分析——第五章 系统调用
  3. OpenCASCADE绘制测试线束:使用自定义命令扩展测试工具
  4. Java面向对象概述
  5. Unity3D_07_日志、文本打印
  6. NET Core入门笔记
  7. spring jaxb_自定义Spring命名空间使JAXB变得更容易
  8. java log.error_Logger.error打印错误异常的详细堆栈信息
  9. RabbitMQ控制台详解
  10. Gradle笔记——构建基础
  11. [Asp.net 5] DependencyInjection项目代码分析4-微软的实现(2)
  12. 稀疏编码: LASSO,近端梯度优化(PGD),迭代软阈值算法(ISTA),L-Lipschitz条件,软阈值
  13. 代理app请求地址访问本机服务(同一局域网的本地起的服务器)方便测试app
  14. 《JavaScript 20 年》中文版之语言诞生
  15. centos 网络流量监控方法总结
  16. CSS 边框四个角效果
  17. opencv入门—播放AVI视频
  18. SQL Server 2012新建本地服务器组注册服务器
  19. 原生JavaScript实现团购——限时抢
  20. day04 RabbitMQ基本使用

热门文章

  1. 考前必背的50个知识点——系统集成项目管理工程师考试
  2. apache配置mpm_worker
  3. 专家答疑:揭开虚拟化的迷雾
  4. golang mac 环境变量_Golang (Go语言) Mac OS X下环境搭建 环境变量配置 开发工具配置 Sublime Text 2...
  5. Unity的序列化机制探索
  6. C# XML文件读取
  7. spring 数组中随机取几个_最新redux-spring前端模块化框架
  8. 外层div自动撑大为什么没有最大_在工业自动化行业,为什么电阻触摸屏更受欢迎...
  9. 5.2自动扫描及装配数据
  10. 使用 Eclipse 平台进行调试