美文网首页学习准备
GCD的串行队列和并行队列

GCD的串行队列和并行队列

作者: 小巷深深 | 来源:发表于2015-12-08 17:05 被阅读1282次

GCD中有三种队列类型:

  1. The main queue: 与主线程功能相同。是一个串行队列。
  2. Global queues: 全局队列是并发队列,并由整个进程共享。进程中存在四个全局队列:高、中(默认)、低、后台四个优先级队列。优先级:
#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
  1. 用户队列: 用户队列是串行的
    创建:
//main_queue
dispatch_queue_t GCDQueue = dispatch_get_main_queue();
//global_queue
dispatch_queue_t GCDQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//user_queue
dispatch_queue_t GCDQueue = dispatch_queue_create("com.test.gcd", NULL);

global_queue是一个全局并发队列,即加入global_queue的代码块会立即被执行
如下代码,在global_queue中先后加入两个代码块

-(void)test {
    dispatch_queue_t GCDQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    dispatch_async(GCDQueue, ^{
            NSLog(@"111111111111");
            NSLog(@"111111111111");
            NSLog(@"111111111111");
            NSLog(@"111111111111");
            NSLog(@"111111111111");
    });
    
    dispatch_async(GCDQueue, ^{
            NSLog(@"22222222222222");
            NSLog(@"22222222222222");
            NSLog(@"22222222222222");
            NSLog(@"22222222222222");
            NSLog(@"22222222222222");
            NSLog(@"22222222222222");
    });
}

执行结果:

2014-03-10 22:51:09.498 gcdtest[18010:4207] 22222222222222
2014-03-10 22:51:09.498 gcdtest[18010:1103] 111111111111
2014-03-10 22:51:09.501 gcdtest[18010:4207] 22222222222222
2014-03-10 22:51:09.501 gcdtest[18010:1103] 111111111111
2014-03-10 22:51:09.501 gcdtest[18010:4207] 22222222222222
2014-03-10 22:51:09.502 gcdtest[18010:1103] 111111111111
2014-03-10 22:51:09.502 gcdtest[18010:4207] 22222222222222
2014-03-10 22:51:09.503 gcdtest[18010:4207] 22222222222222
2014-03-10 22:51:09.503 gcdtest[18010:1103] 111111111111
2014-03-10 22:51:09.504 gcdtest[18010:4207] 22222222222222
2014-03-10 22:51:09.504 gcdtest[18010:1103] 111111111111

可以看出两个代码块是并发执行

user_queue是用户创建的串行队列,用户加入到此队列的代码块将按加入队列的时间先后执行,当前一个代码快执行完毕才会执行下一个代码块
如下代码:

-(void)test{
    dispatch_queue_t userQueue = dispatch_queue_create("com.test.gcd", DISPATCH_QUEUE_SERIAL);    
        dispatch_async(userQueue,^{
            NSLog(@"111111111111");
            NSLog(@"111111111111");
            NSLog(@"111111111111");
        });

        dispatch_async(userQueue,^{
            NSLog(@"22222222222222");
            NSLog(@"22222222222222");
            NSLog(@"22222222222222");
            NSLog(@"22222222222222");
        });
}

执行结果:

2014-03-10 22:56:55.928 gcdtest[18046:1c03] 111111111111
2014-03-10 22:56:55.929 gcdtest[18046:1c03] 111111111111
2014-03-10 22:56:55.929 gcdtest[18046:1c03] 111111111111
2014-03-10 22:56:55.930 gcdtest[18046:1c03] 22222222222222
2014-03-10 22:56:55.930 gcdtest[18046:1c03] 22222222222222
2014-03-10 22:56:55.930 gcdtest[18046:1c03] 22222222222222
2014-03-10 22:56:55.930 gcdtest[18046:1c03] 22222222222222

在并发线程中,日志1首先加入队列,执行完毕后执行日志2

再在日志1中加入延迟

-(void)test{
    __block dispatch_queue_t userQueue = dispatch_queue_create("com.test.gcd", NULL);
    
    dispatch_queue_t GCDQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
    dispatch_async(GCDQueue, ^{
        [NSThread sleepForTimeInterval:2.0f];
        dispatch_async(userQueue,^{
            NSLog(@"111111111111");
            NSLog(@"111111111111");
            NSLog(@"111111111111");
        });
    });
    
    dispatch_async(GCDQueue, ^{
        dispatch_async(userQueue,^{
            NSLog(@"22222222222222");
            NSLog(@"22222222222222");
            NSLog(@"22222222222222");
            NSLog(@"22222222222222");
        });
    });
}

执行结果:

2014-03-10 22:58:16.991 gcdtest[18066:1103] 22222222222222
2014-03-10 22:58:16.992 gcdtest[18066:1103] 22222222222222
2014-03-10 22:58:16.993 gcdtest[18066:1103] 22222222222222
2014-03-10 22:58:16.993 gcdtest[18066:1103] 22222222222222
2014-03-10 22:58:19.066 gcdtest[18066:1903] 111111111111
2014-03-10 22:58:19.066 gcdtest[18066:1903] 111111111111
2014-03-10 22:58:19.067 gcdtest[18066:1903] 111111111111

添加延时,日志1晚于日志2加入队列,日志2执行完后再执行日志1

我创建了一个QQ群,希望大家能本着互联网开放的心态,将遇到的问题和经验在群里分享,大家互相交流心得,共同提高。
群号:77311380

相关文章

  • 关于多线程GCD 串行/并行、同步/异步

    一、GCD串行/并行队列创建 串行队列: 并行队列: 二、GCD串行/并行队列同步/异步执行 执行内容1: 执行结...

  • GCD死锁

    GCD死锁原因 GCD死锁的原因是队列阻塞,而不是线程阻塞! 串行和并行 串行和并行都是相对于队列而言的-队列(负...

  • GCD多线程问题整理

    1.GCD队列有哪几种类型?有哪几种队列? GCD队列分为串行队列、并行队列两种类型;队列有主串行队列、全局并行队...

  • IOS多线程总结

    目录 简述 NSThread GCD操作与队列异步操作并行队列同步操作并行队列同步操作串行队列异步操作串行队列队列...

  • iOS开发中GCD普遍使用

    1.全局队列和主队 2.串行队列和并行队列 串行队列 并行队列 3.多个线程子任务完成后再执行某一个任务,GCD线...

  • 多线程之GCD

    GCD的队列分为串行队列和并行队列两类: 串行队列:只有一个线程,加入到队列中的操作按添加顺序依次执行。并发队列:...

  • iOS - GCD

    GCD队列 串行队列 并行队列 全局队列 主队列 几个容易混淆的概念dispatch_barrier_async栅...

  • iOS开发笔记-多线程的使用方法

    多线程方式一:GCD队列的3个种类: 自建队列: 分并行/串行 全局队列: 属于并行队列, 是系统默认创建的. 主...

  • GCD

    GCD 1.串行队列 创建串行队列的两种方式 (队列 FIFO 按添加的先后顺序执行) 2.并行队列 dispat...

  • 【iOS出租屋进阶】之多线程GCD详解

    线程、任务和队列的概念 异步、同步 & 并行、串行的特点 组合 |并行队列|串行队列 |主队列----|----|...

网友评论

    本文标题:GCD的串行队列和并行队列

    本文链接:https://www.haomeiwen.com/subject/kemehttx.html