GCD案例解析

在GCD中可以通过 dispatch_get_global_queue 获取全局并发队列。也可以自己去创建队列,而已指定该队列是并发还是串行对接。

下面这个例子是获取全局队列,在里面创建了三个异步的线程。

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(queue, ^{
        NSLog(@"1");
        NSLog(@"11");
    });
    dispatch_async(queue, ^{
        NSLog(@"2");
        NSLog(@"22");
    });
    dispatch_async(queue, ^{
        NSLog(@"3");
        NSLog(@"33");
    });
    dispatch_async(queue, ^{
        NSLog(@"4");
        NSLog(@"44");
    });

    NSLog(@"5");

结果打印如下:

2018-03-11 18:04:05.140000+0800 GCDTest[5220:1307986] 3
2018-03-11 18:04:05.140000+0800 GCDTest[5220:1308000] 1
2018-03-11 18:04:05.140000+0800 GCDTest[5220:1307985] 2
2018-03-11 18:04:05.140000+0800 GCDTest[5220:1307919] 5
2018-03-11 18:04:05.140031+0800 GCDTest[5220:1307987] 4
2018-03-11 18:04:05.140163+0800 GCDTest[5220:1307985] 22
2018-03-11 18:04:05.140163+0800 GCDTest[5220:1308000] 11
2018-03-11 18:04:05.140166+0800 GCDTest[5220:1307986] 33
2018-03-11 18:04:05.140272+0800 GCDTest[5220:1307987] 44

现象:经过多次打印,你会发现,1 2 3 4 5的打印顺序是不固定的,11 22 33 44 的打印顺序也是不固定的,但二位数字的总是都在一位数字的后面。

分析:该案例在并发的队列里创建了三个异步的线程,1 2 3 4 和 11 22 33 44 都在异步线程中执行。而 5 是在 主线程中执行。我们都知道,异步线程不会阻塞主线程,所以主线程和另外三个线程也是并发执行的。所以,1 2 3 4 5 的执行顺序是不固定的。另外 1 和 11 同第一个异步线程中,尽管该线程是异步的,但线程中的任务还是按照顺利同步执行的,其他几个线程也是这个道理。因此,11 22 33 44 ,总是在 1 2 3 4 5 的后面执行。

那么如果是串行队列里的异步线程呢?

  dispatch_queue_t  queue = dispatch_queue_create("队列名称", DISPATCH_QUEUE_SERIAL);

    dispatch_async(queue, ^{
        NSLog(@"1");
        NSLog(@"11");
    });
    dispatch_async(queue, ^{
        NSLog(@"2");
        NSLog(@"22");
    });
    dispatch_async(queue, ^{
        NSLog(@"3");
        NSLog(@"33");
    });
    dispatch_async(queue, ^{
        NSLog(@"4");
        NSLog(@"44");
    });
    NSLog(@"5");

打印结果:

2018-03-11 18:54:09.942883+0800 GCDTest[5530:1344785] 5
2018-03-11 18:54:09.942883+0800 GCDTest[5530:1344844] 1
2018-03-11 18:54:09.943089+0800 GCDTest[5530:1344844] 11
2018-03-11 18:54:09.943376+0800 GCDTest[5530:1344844] 2
2018-03-11 18:54:09.943479+0800 GCDTest[5530:1344844] 22
2018-03-11 18:54:09.944976+0800 GCDTest[5530:1344844] 3
2018-03-11 18:54:09.945878+0800 GCDTest[5530:1344844] 33
2018-03-11 18:54:09.946801+0800 GCDTest[5530:1344844] 4
2018-03-11 18:54:09.946942+0800 GCDTest[5530:1344844] 44

多次打印后,你会发现除了 1 和 5 的顺序是不固定的。其他顺序都是 1 11 2 22….顺序执行的。5是在主线程中执行,因次我们可以推断出1是在异步线程中执行,和主线程并发执行。该同步队列中的四个异步线程是按照顺序执行的。因为在异步线程1之后后,继续执行异步线程2。

借用一个图片总结一下就是:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值