欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

GCD案例解析

程序员文章站 2024-03-24 22:32:10
...

在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。

借用一个图片总结一下就是:
GCD案例解析

相关标签: GCD