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

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

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

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

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

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

  1. -- ::12.652 -GCD-sync[:] 当前线程:<NSThread: 0x7fba88d16870>{number = , name = main}
  2. -- ::12.652 -GCD-sync[:] 任务1,当前线程:<NSThread: 0x7fba88d16870>{number = , name = main}
  3. -- ::12.653 -GCD-sync[:] 任务2,当前线程:<NSThread: 0x7fba88d16870>{number = , name = main}

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

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

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

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

  1. -- ::27.316 -GCD-sync[:] 当前线程:<NSThread: 0x7f8633d14370>{number = , name = main}
  2. -- ::27.317 -GCD-sync[:] 任务1,当前线程:<NSThread: 0x7f8633d14370>{number = , name = main}
  3. -- ::27.317 -GCD-sync[:] 任务2,当前线程:<NSThread: 0x7f8633d14370>{number = , name = main}

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

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

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

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

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, );

  1. //异步开启一个新的线程
  2. dispatch_async(queue, ^{
  3.  
  4. //新线程
  5. NSLog(@"新的线程:%@",[NSThread currentThread]);
  6.  
  7. //在向新线程同步添加任务
  8. dispatch_sync(queue, ^{
  9. NSLog(@"任务3,当前线程:%@",[NSThread currentThread]);
  10. });
  11. dispatch_sync(queue, ^{
  12. NSLog(@"任务4,当前线程:%@",[NSThread currentThread]);
  13. });
  14. });

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

  1. -- ::09.615 -GCD-sync[:] 当前线程:<NSThread: 0x7fcf43f0e750>{number = , name = main}
  2. -- ::09.616 -GCD-sync[:] 新的线程:<NSThread: 0x7fcf43c426e0>{number = , name = (null)}
  3. -- ::09.616 -GCD-sync[:] 任务3,当前线程:<NSThread: 0x7fcf43c426e0>{number = , name = (null)}
  4. -- ::09.617 -GCD-sync[:] 任务4,当前线程:<NSThread: 0x7fcf43c426e0>{number = , name = (null)}

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

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

  1. //当前主线程
  2. NSLog(@"当前线程:%@",[NSThread currentThread]);
  3.  
  4. // 创建一个自定义的串行队列
  5. dispatch_queue_t myqueue = dispatch_queue_create("myqueue", DISPATCH_QUEUE_CONCURRENT);
  6.  
  7. //异步开启一个新的线程
  8. dispatch_async(myqueue, ^{
  9.  
  10. //新线程
  11. NSLog(@"新线程:%@",[NSThread currentThread]);
  12.  
  13. //在向新线程同步添加任务
  14. dispatch_sync(myqueue, ^{
  15. NSLog(@"任务3,当前线程:%@",[NSThread currentThread]);
  16. });
  17. dispatch_sync(myqueue, ^{
  18. NSLog(@"任务4,当前线程:%@",[NSThread currentThread]);
  19. });
  20. });

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

  1. -- ::49.023 -GCD-sync[:] 当前线程:<NSThread: 0x7ffec3f07ca0>{number = , name = main}
  2. -- ::49.024 -GCD-sync[:] 新线程:<NSThread: 0x7ffec3e18180>{number = , name = (null)}
  3. -- ::49.024 -GCD-sync[:] 任务3,当前线程:<NSThread: 0x7ffec3e18180>{number = , name = (null)}
  4. -- ::49.025 -GCD-sync[:] 任务4,当前线程:<NSThread: 0x7ffec3e18180>{number = , name = (null)}

iOS:对GCD中 同步、异步、并行、串行的见解的更多相关文章

  1. iOS:GCD理解1(同步-异步、串行-并行)

    1.并行-异步(ST1与ST2抢占资源) 1-1).获取 并行(全局)队列 ,DISPATCH_QUEUE_PRIORITY_DEFAULT 为默认优先级. dispatch_queue_t queu ...

  2. 【iOS开发-91】GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例

    (1)GCD实现的同步异步.串行并行. --同步sync应用场景:用户登录,利用堵塞 --串行异步应用场景:下载等耗时间的任务 /** * 由于是异步.所以开通了子线程.可是由于是串行队列,所以仅仅须 ...

  3. GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例

    转:http://www.tuicool.com/articles/NVVnMn (1)GCD实现的同步异步.串行并行. ——同步sync应用场景:用户登录,利用阻塞 ——串行异步应用场景:下载等耗时 ...

  4. 【原】iOS多线程之异步任务+并行队列情况与异步任务+串行队列(主队列)情况

    异步任务+并行队列 把异步任务放到并行队列进行执行,异步任务会在不同的线程中执行. /*异步执行+并行队列*/ - (IBAction)clickBasic1:(UIButton *)sender { ...

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

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

  6. ios--进程/多线程/同步任务/异步任务/串行队列/并行队列(对比分析)

    现在先说两个基本的概念,啥是进程,啥是线程,啥又是多线程;先把这两个总是给弄清再讲下面的 进程:正在进行的程序,我们就叫它进程. 线程:线程就是进程中的一个独立的执行路径.这句话怎么理解呢! 一个程序 ...

  7. GCD,用同步/异步函数,创建并发/串行队列

    队列  第一个参数:C语言字符串,标签 第二个参数: DISPATCH_QUEUE_CONCURRENT:并发队列 DISPATCH_QUEUE_SERIAL:串行队列 dispatch_queue_ ...

  8. Python并发编程系列之常用概念剖析:并行 串行 并发 同步 异步 阻塞 非阻塞 进程 线程 协程

    1 引言 并发.并行.串行.同步.异步.阻塞.非阻塞.进程.线程.协程是并发编程中的常见概念,相似却也有却不尽相同,令人头痛,这一篇博文中我们来区分一下这些概念. 2 并发与并行 在解释并发与并行之前 ...

  9. iOS 关于GCD中的队列

    GCD中队列分类及获得方式 1.串行队列  dispatch_queue_t queue = dispatch_queue_create("队列名", DISPATCH_QUEUE ...

随机推荐

  1. HDU-1151

    Air Raid Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  2. git 查看远程分支 $ git branch -a

    查看远程分支 加上-a参数可以查看远程分支,远程分支会用红色表示出来(如果你开了颜色支持的话): 1 2 3 4 5 6 7 8 9 10 $ git branch -a master remote ...

  3. Python+Selenium 自动化实现实例-Link 捕捉元素的几种方法

    from selenium import webdriver driver = webdriver.Chrome() driver.get("http://www.baidu.com&quo ...

  4. Linux下服务器搭建

    一.安装前准备工作 yum -y install gcc   yum -y install gcc-c++   yum -y install make yum -y install ncurses-d ...

  5. mp4文件格式解析(转载)

    mp4文件格式解析 原作:http://blog.sina.com.cn/s/blog_48f93b530100jz4b.html 目前MP4的概念被炒得很火,也很乱.最开始MP4指的是音频(MP3的 ...

  6. C++ 单例模式的几种实现研究

    都是从网上学得,整理下自己的理解. 单例模式有两种实现模式: 1)懒汉模式: 就是说当你第一次使用时才创建一个唯一的实例对象,从而实现延迟加载的效果. 2)饿汉模式: 就是说不管你将来用不用,程序启动 ...

  7. 《深入理解Android2》读书笔记(八)

    接上篇<深入理解Android2>读书笔记(七) AMS中的进程管理 AMS对进程的管理仅涉及两个方面 1.调节进程的调度优先级和调度策略 2.调节进程的oom值 调度优先级和调度策略 1 ...

  8. django-BBS(1)

    1.首先分析BBS的设计需要,然后设计相应的数据库.填写在models.py 中 2.修改setting.py中的内容: a.将appname加入INSTALLED_APP中 b.修改DATABASE ...

  9. CodeForces 731E Funny Game

    博弈,$dp$. 设$f[i]$表示 如果先手第一次出手取到位置$i$,直到游戏结束,双方均采取最优策略,先手-后手得分的差值. 那么$f[i]=min(sum[i]-sum[j]+maxf[j+1] ...

  10. 贪心【CF1029E】Tree with Small Distances

    Description 给定一棵树.要求往树中加入一些边使得从1到其他节点的距离至多是2 . 输出加入边的最小数量.(边全部都是无向的) Input 第一行一个整数n,表示树中的节点个数. 接下来n− ...