ios多线程操作(五)—— GCD串行队列与并发队列

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个异步任务添加的串行队列中,无论如何都会依次一个一个执行,而且只会开启一条线程

如果将任务改为同步任务,那么运行结果可想而知(同步任务的特性)

并发队列:

并发队列可以让多个认为女巫并发(同时)执行,它会自动开启多个线程同时执行任务,并发功能只有在异步函数下才会有效,例如有如下代码,并行队列下执行同步任务:

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

运行结果如下:

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

时间: 2024-10-16 14:11:45

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

《iOS面试之道》-“串行队列的代码实战” 勘误

一.原书第一版154页开始讲解串行队列.并发队列.以及在Dispatch_Async.Dispatch_Sync下面的作用 最后一段代码: if(_q == NULL) { _q = dispatch_queue_create("SerialQueue", DISPATCH_QUEUE_SERIAL); } NSMutableString *str = [[NSMutableString alloc] init]; [str appendString:@"1"];

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

本文用来介绍 iOS 多线程中 GCD 的相关知识以及使用方法.这大概是史上最详细.清晰的关于 GCD 的详细讲解+总结的文章了.通过本文,您将了解到: 1. GCD 简介 2. GCD 任务和队列 3. GCD 的使用步骤 4. GCD 的基本使用(6种不同组合区别) 5. GCD 线程间的通信 6. GCD 的其他方法(栅栏方法:dispatch_barrier_async.延时执行方法:dispatch_after.一次性代码(只执行一次):dispatch_once.快速迭代方法:dis

iOS多线程开发之GCD 用法入门

我们知道,在iOS中进行多线程编程,主要有三种方式:[NSThread].[NSOperation]和[GCD].其中又以[GCD]为苹果官方最为推荐.本文将利用一个简单的demo,简述GCD的用法入门,以及本人对GCD的一点肤浅理解和学习心得. 先把参考文章列出: http://www.cnblogs.com/kenshincui/p/3983982.html http://www.cnblogs.com/sunfrog/p/3305614.html http://mobile.51cto.c

iOS多线程开发之GCD(下篇)

上篇和中篇讲解了什么是GCD,如何使用GCD,这篇文章将讲解使用GCD中将遇到的死锁问题.有兴趣的朋友可以回顾<iOS多线程开发之GCD(上篇)>和<iOS多线程开发之GCD(中篇)>. 言归正传,我们首先来回顾下死锁,所谓死锁: 是指两个或两个以上的进程(线程)在执行过程中,因争夺资源(如数据源,内存等,变量不是资源)而造成的一种互相等待的现象,若无外部处理作用,它们都将无限等待下去. 死锁形成的原因: 系统资源不足 进程(线程)推进的顺序不恰当: 资源分配不当 死锁形成的条件:

IOS多线程开发之GCD

概要 GCD的全称是Grand Central Dispatch(译为中心调度队列?),可以理解为线程管理队列,是苹果公司为多核的并行运算提出的解决方案,能够根据系统环境自适应线程管理,基本属于全自动的线程管理. 在GCD里面,任务需要放到队列里面执行,队列根据自身属性分发任务执行,不过原则总是FIFO.队列分为串行和并行队列,串行队列是队列里面只有一个线程,所以队列里面只有一个任务在执行,而并行则会根据系统环境,自动调节线程数,可支持同时多个任务执行. GCD提供了创建以及获取队列的方法,包括

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

进程:正在进行中的程序被称为进程,负责程序运行的内存分配;每一个进程都有自己独立的虚拟内存空间: 线程:线程是进程中一个独立的执行路径(控制单元);一个进程中至少包含一条线程,即主线程. 队列:dispatch_queue_t,一种先进先出的数据结构,线程的创建和回收不需要程序员操作,由队列负责. 串行队列:队列中的任务只会顺序执行(类似跑步) dispatch_queue_t q = dispatch_queue_create(“....”, dispatch_queue_serial); 并

ios多线程操作(六)—— GCD全局队列与主队列

GCD默认已经提供了全局的并发队列供整个应用使用,所以可以不用手动创建. 创建全局队列的函数为 dispatch_queue_t q = dispatch_get_global_queue(long identifier, unsigned long flags) 参数类型为: long identifier:ios 8.0 告诉队列执行任务的"服务质量 quality of service",系统提供的参数有: QOS_CLASS_USER_INTERACTIVE 0x21,    

猫猫学iOS(五十)多线程网络之GCD简单介绍(任务,队列)

猫猫分享,必须精品 原创文章,欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243?viewmode=contents GCD简单介绍 1.什么是GCD? 全称是Grand Central Dispatch,可译为"牛逼的中枢调度器" 纯C语言,提供了非常多强大的函数 2.GCD的优势 GCD是苹果公司为多核的并行运算提出的解决方案 GCD会自动利用更多的CPU内核(比如双核.四核) GCD会自动管理线程的生命周期(创建线程.调度任务

ios多线程操作(七)—— GCD延迟操作与一次性代码

使用GCD函数可以进行延时操作,该函数为 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ }); 现在我们来分解一下参数 dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)) : NSEC_PER_SEC在头文