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案例解析
-
Java使用Jsoup简单解析页面 博客分类: Java Tools jsoup
-
Python之数据处理案例
-
从一则案例解析js正则的String对象的replace方法使用技巧
-
Spring源代码解析(十):Spring Acegi框架授权的实现 博客分类: Spring框架 spring
-
java swing二维码生成和解析工具 博客分类: 热门技术 swing二维码
-
Spring源代码解析(十):Spring Acegi框架授权的实现 博客分类: Spring框架 spring
-
Spring源代码解析(九):Spring Acegi框架鉴权的实现 博客分类: Spring框架 spring
-
java swing二维码生成和解析工具 博客分类: 热门技术 swing二维码