iOS:对GCD中 同步、异步、并行、串行的见解

简介:

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)}
复制代码

 

程序猿神奇的手,每时每刻,这双手都在改变着世界的交互方式!
分类:  iOS高级

本文转自当天真遇到现实博客园博客,原文链接:http://www.cnblogs.com/XYQ-208910/p/4861873.html,如需转载请自行联系原作者
相关文章
|
2月前
|
API Swift C语言
探索iOS开发:Swift中的异步编程与GCD应用
【8月更文挑战第4天】在iOS开发的海洋中,掌握Swift语言的航向是至关重要的。本文将引领你深入理解Swift中的异步编程概念,并借助Grand Central Dispatch(GCD)这一强大的工具,来简化并发编程的复杂性。我们将通过实际代码示例,展现如何在iOS应用中高效地管理后台任务和提升用户界面的响应性。
55 3
|
5月前
|
iOS开发 开发者 UED
iOS 中的并发编程:GCD 与 Operation 的对比与实践
【4月更文挑战第23天】 在iOS开发中,为了提高应用的性能和响应能力,理解并合理运用并发编程是至关重要的。本文将深入探讨两种主要的并发模式:Grand Central Dispatch (GCD) 和 NSOperation。我们将比较它们的优势和局限性,并通过代码示例演示如何在实际场景中应用这两种技术来优化应用性能。文章旨在为开发者提供一个清晰的指南,以便在选择适合自己项目的并发工具时做出明智的决策。
|
5月前
|
调度 iOS开发 开发者
iOS 中的并发编程模式:理解 GCD 和 Operation Queues
【4月更文挑战第19天】 在现代 iOS 应用开发中,有效地管理线程和并发是至关重要的。为了确保用户界面的流畅性和后台任务的高效运行,开发者需要掌握并发编程技术。本文深入探讨了两种主要的并发模式:Grand Central Dispatch (GCD) 和 Operation Queues。我们将分析它们的工作原理,比较它们的特点,并通过实际代码示例说明如何在 iOS 应用中实现高效的并发处理。通过本文,读者将获得在 iOS 平台上进行多线程开发的实用知识,以及如何根据不同的应用场景选择最合适的并发工具。
|
5月前
|
iOS开发
多线程和异步编程:解释 iOS 中的同步和异步任务的概念。
多线程和异步编程:解释 iOS 中的同步和异步任务的概念。
114 1
|
5月前
|
API 调度 iOS开发
多线程和异步编程:什么是 GCD(Grand Central Dispatch)?如何在 iOS 中使用 GCD?
多线程和异步编程:什么是 GCD(Grand Central Dispatch)?如何在 iOS 中使用 GCD?
60 1
|
安全 调度 C语言
iOS多线程之GCD-同步、异步、并发、串行、线程组、栅栏函数、信号量等全网最全的总结
iOS多线程之GCD-同步、异步、并发、串行、线程组、栅栏函数、信号量等全网最全的总结
825 1
|
iOS开发
iOS多线程的初步研究-- dispatch同步
GCD提供两种方式支持dispatch队列同步,即dispatch组和信号量。
177 0
|
iOS开发
ios实战-runloop实现的同步弹窗
我们知道UIAlertView使用delegate返回数据实现的,使用麻烦,之前介绍过用Block实现的例子《ios实战-使用Block的UIAlertView》 今天介绍使用runloop实现,用return返回点击的结果的方式
114 0
|
数据库 iOS开发 开发者
IOS同步下载
在IOS的客户端与服务器交互的时候为的是获取数据,因为有一些持久化数据的方法是在应用程序本地用的。是在没有wifi的情况下才会用到类似数据库Sqlite3一种轻量级的嵌入式数据库)。 那么进入话题下面介绍用通过 NSURLConnection 向服务器发送一个同步的请求来获取数据。
557 0
|
6天前
|
IDE Android开发 iOS开发
探索Android与iOS开发的差异:平台选择对项目成功的影响
【9月更文挑战第27天】在移动应用开发的世界中,Android和iOS是两个主要的操作系统平台。每个系统都有其独特的开发环境、工具和用户群体。本文将深入探讨这两个平台的关键差异点,并分析这些差异如何影响应用的性能、用户体验和最终的市场表现。通过对比分析,我们将揭示选择正确的开发平台对于确保项目成功的重要作用。