博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2016 - 1 -17 GCD学习总结
阅读量:4324 次
发布时间:2019-06-06

本文共 4517 字,大约阅读时间需要 15 分钟。

一:GCD中的两个核心概念,队列与任务:

1.任务:执行什么操作。(代码块 block)

 任务执行的类型分为以下两种:

 1.1同步执行任务:在当前线程执行任务。不会开辟新的线程。

 1.2异步执行任务:在其他线程执行任务,会开辟新的线程。

2.队列:用来存放任务,先进先出。它会吧任务一个个取出来然后放到对应的线程中执行。

 队列的类型分为以下两种:

 2.1串行队列:队列里的任务执行模式为一个接一个,一次只会取出一个任务

 2.2并发队列:同时执行多个任务,一次拿出所有任务

二:GCD中不同队列与任务模式组合情况:

1.同步----串行:即在当前线程中,一个一个执行任务!代码如下:

- (void)touchesBegan:(NSSet
*)touches withEvent:(UIEvent *)event{ // 调用方法 [self test1];}- (void)test1{ // 创建串行队列 //dispatch_queue_create(<#const char *label#>, <#dispatch_queue_attr_t attr#>)中,第一个参数为标签,第二个参数为队列类型,DISPATCH_QUEUE_SERIAL意为串行队列 也可以写为NULL! dispatch_queue_t queue = dispatch_queue_create("zz", DISPATCH_QUEUE_SERIAL); // 在队列里加入任务 for (int i = 0 ; i < 10; i ++) { dispatch_sync(queue, ^{
// 创建任务,类型为同步,即在当前线程(也就是main线程)执行任务。 // dispath_sync表示为同步 NSLog(@"当前操作咋%@线程 --- 任务号 = %d",[NSThread currentThread],i); }); }}

2.同步-----并行:即在当前线程中,同时执行多个任务(没意义,因为同一条线程中,同时只能执行一个任务!)

代码如下:

- (void)test2{    // 创建并行队列     //参数中,DISPATCH_QUEUE_CONCURRENT表示当前队列为并行队列,要同时执行   dispatch_queue_t queue =  dispatch_queue_create("zzz", DISPATCH_QUEUE_CONCURRENT);    // 同步执行任务    for (int i = 0 ;i < 10; i ++) {        dispatch_sync(queue, ^{            NSLog(@"当前操作咋%@线程 ---  任务号 = %d",[NSThread currentThread],i);        });    }}

3.异步------串行:即在新的线程中,一个一个去执行任务!

代码如下:

- (void)test3{    // 创建串行队列    dispatch_queue_t queue = dispatch_queue_create("zz", NULL);    // 异步执行任务 即要开辟新的线程去执行    for (int i = 0 ;i < 10; i ++) {        dispatch_async(queue, ^{            NSLog(@"当前操作咋%@线程 ---  任务号 = %d",[NSThread currentThread],i);        });    }}

打印结果中的一部分:

16-01-17 21:22:53.890 wdqdqw[14355:1205296] 当前操作咋<NSThread: 0x7f8aeae156b0>{number = 2, name = (null)}线程 ---  任务号 = 2

2016-01-17 21:22:53.890 wdqdqw[14355:1205296] 当前操作咋<NSThread: 0x7f8aeae156b0>{number = 2, name = (null)}线程 ---  任务号 = 3

2016-01-17 21:22:53.891 wdqdqw[14355:1205296] 当前操作咋<NSThread: 0x7f8aeae156b0>{number = 2, name = (null)}线程 ---  任务号 = 4

2016-01-17 21:22:53.891 wdqdqw[14355:1205296] 当前操作咋<NSThread: 0x7f8aeae156b0>{number = 2, name = (null)}线程 ---  任务号 = 5

2016-01-17 21:22:53.891 wdqdqw[14355:1205296] 当前操作咋<NSThread: 0x7f8aeae156b0>{number = 2, name = (null)}线程 ---  任务号 = 6

2016-01-17 21:22:53.891 wdqdqw[14355:1205296] 当前操作咋<NSThread: 0x7f8aeae156b0>{number = 2, name = (null)}线程 ---  任务号 = 7

2016-01-17 21:22:53.891 wdqdqw[14355:1205296] 当前操作咋<NSThread: 0x7f8aeae156b0>{number = 2, name = (null)}线程 ---  任务号 = 8

2016-01-17 21:22:53.892 wdqdqw[14355:1205296] 当前操作咋<NSThread: 0x7f8aeae156b0>{number = 2, name = (null)}线程 ---  任务号 = 9  

4.异步-----并行:即为开辟新的线程,且同时执行多个任务,需要注意开辟的线程数量是我们不能控制的,而且线程们的执行效率也可能不同!

代码如下:

- (void)test4{    // 创建并行队列    dispatch_queue_t queue = dispatch_queue_create("zz", DISPATCH_QUEUE_CONCURRENT);    // 异步执行任务    for (int i = 0 ;i < 10; i ++) {        dispatch_async(queue, ^{            NSLog(@"当前操作咋%@线程 ---  任务号 = %d",[NSThread currentThread],i);        });    }    }

 

 

 

打印结果:

2016-01-17 21:26:24.370 wdqdqw[14380:1207071] 当前操作咋<NSThread: 0x7fc402c11940>{number = 2, name = (null)}线程 ---  任务号 = 0

2016-01-17 21:26:24.370 wdqdqw[14380:1207070] 当前操作咋<NSThread: 0x7fc402f08900>{number = 3, name = (null)}线程 ---  任务号 = 1

2016-01-17 21:26:24.370 wdqdqw[14380:1207081] 当前操作咋<NSThread: 0x7fc402d032a0>{number = 5, name = (null)}线程 ---  任务号 = 3

2016-01-17 21:26:24.370 wdqdqw[14380:1207082] 当前操作咋<NSThread: 0x7fc402f0a200>{number = 6, name = (null)}线程 ---  任务号 = 4

2016-01-17 21:26:24.370 wdqdqw[14380:1207067] 当前操作咋<NSThread: 0x7fc402c064b0>{number = 4, name = (null)}线程 ---  任务号 = 2

2016-01-17 21:26:24.370 wdqdqw[14380:1207083] 当前操作咋<NSThread: 0x7fc402da07e0>{number = 7, name = (null)}线程 ---  任务号 = 5

2016-01-17 21:26:24.371 wdqdqw[14380:1207071] 当前操作咋<NSThread: 0x7fc402c11940>{number = 2, name = (null)}线程 ---  任务号 = 6

2016-01-17 21:26:24.371 wdqdqw[14380:1207070] 当前操作咋<NSThread: 0x7fc402f08900>{number = 3, name = (null)}线程 ---  任务号 = 7

2016-01-17 21:26:24.371 wdqdqw[14380:1207081] 当前操作咋<NSThread: 0x7fc402d032a0>{number = 5, name = (null)}线程 ---  任务号 = 8

2016-01-17 21:26:24.371 wdqdqw[14380:1207082] 当前操作咋<NSThread: 0x7fc402f0a200>{number = 6, name = (null)}线程 ---  任务号 = 9

 

三:关于任务,队列的总结:

根据上面结果可以看到,任务与队列完全不是一种东西,队列有队列的属性,任务也有任务的属性。

但是他们彼此直接也有一定的联系,即队列不过就是任务的排列形式。

如果把任务和队列都看成对象,那么任务们只知道自己应该在哪个线程中执行和自己应该如何去执行。这是它的属性。即任务本身是个代码块,它有同步与异步之分!!

而队列只知道自己有哪些任务要做和应该怎么去执行任务(同时去执行呢还是一个一个去执行?)。它不知道任务要去干吗,它也不知道要去哪个线程执行。

也就是说,队列把任务们一个一个或者一次性全部的放出去,然后就无作为了。而任务们会去根据自己的属性,去寻找当前线程或者新的线程去执行自己的代码块!

转载于:https://www.cnblogs.com/BJTUzhengli/p/5137863.html

你可能感兴趣的文章
小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_3-5.PageHelper分页插件使用
查看>>
小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_5-6.微信扫码登录回调本地域名映射工具Ngrock...
查看>>
小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_5-8.用户模块开发之保存微信用户信息...
查看>>
Linux下Nginx安装
查看>>
LVM扩容之xfs文件系统
查看>>
Hbase记录-client访问zookeeper大量断开以及参数调优分析(转载)
查看>>
代码片段收集
查看>>
vue-cli3创建项目时报错
查看>>
输入1-53周,输出1-53周的开始时间和结束时间
查看>>
实验二
查看>>
shell——按指定列排序
查看>>
crash 收集
查看>>
507 LOJ 「LibreOJ NOI Round #1」接竹竿
查看>>
UI基础--烟花动画
查看>>
2018. 2.4 Java中集合嵌套集合的练习
查看>>
精通ASP.NET Web程序测试
查看>>
vue 根据不同属性 设置背景
查看>>
51Nod1601 完全图的最小生成树计数 Trie Prufer编码
查看>>
Codeforces 1110D. Jongmah 动态规划
查看>>
android驱动在win10系统上安装的心酸历程
查看>>