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

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

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

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

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

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

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

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

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

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

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

- (void)touchesBegan:(NSSet<UITouch *> *)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 = ; i < ; 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 = ;i < ; i ++) {
dispatch_sync(queue, ^{
NSLog(@"当前操作咋%@线程 --- 任务号 = %d",[NSThread currentThread],i);
});
}
}

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

代码如下:

- (void)test3{
// 创建串行队列
dispatch_queue_t queue = dispatch_queue_create("zz", NULL);
// 异步执行任务 即要开辟新的线程去执行
for (int i = ;i < ; 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 = ;i < ; 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

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

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

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

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

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

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

2016 - 1 -17 GCD学习总结的更多相关文章

  1. 2016 - 1 -17 GCD主队列与全局队列

    一:主队列 1.概念:每一个应用程序对应唯一一个主队列,直接GET即可:在多线程开发中,使用主队列更新UI dispatch_queue_t q = dispatch_get_main_queue() ...

  2. GCD学习 —— 三

    ​ 学习学习dispatch_block,在向队列中添加任务时,可以直接在对应的函数中添加 block.但是如果想对任务进行操作,比如监听任务.取消任务,就需要获取对应的 block. 1 创建Blo ...

  3. 更新日志(建议升级到2016.12.17) && 更新程序的方法

    更新程序的方法: 1,在控制面板里点击备份当前数据库文件到磁盘,把当天获取的信息从内存写到磁盘/存储卡.2,下载最新版的源码 wget -O "infopi.zip" " ...

  4. 2018面向对象程序设计(Java)第17周学习指导及要求

    2018面向对象程序设计(Java)第17周学习指导及要求(2018.12.20-2018.12.23)   学习目标 (1) 掌握线程同步的概念及实现技术: (2) Java线程综合编程练习 学习资 ...

  5. 《Think Python》第17章学习笔记

    目录 <Think Python>第17章学习笔记 17.1 面向对象的特性(Object-oriented features) 17.2 打印对象(Printing objects) 1 ...

  6. Murano Weekly Meeting 2016.05.17

    Meeting time: 2016.May.17 1:00~2:00 Chairperson:  Kirill Zaitsev, from Mirantis Meeting summary:   1 ...

  7. 2016.8.17上午纪中初中部NOIP普及组比赛

    2016.8.17上午纪中初中部NOIP普及组比赛 链接:https://jzoj.net/junior/#contest/home/1335 本来觉得自己能考高分,但只得160分,并列第九.至少又挤 ...

  8. 2016.9.17初中部下午NOIP普及组比赛总结

    2016.9.17初中部下午NOIP普及组比赛总结 2016.09.17[初中部 NOIP普及组 ]模拟赛 最近几次的题目都不是自己擅长的啊... 不过含金量挺高的,也好... 进度: 比赛:0+0+ ...

  9. Dreamweaver学习笔记---2016.08.17

    静态网页:不访问数据库,直接写入HTML. 动态网页:在网上发布好的,我们可以通过网页预览到的,具有访问数据库的过程. HTML:Hyper Text Markup Language,超文本语音标记. ...

随机推荐

  1. javaSE基础之记事本编程

    首先安装好jdk和jre,之后进行如下操作: 1. 将代码记事本---->cmd--->javac 文件名.java ----->java 文件名 如图: 2. 关于记事本文件属性的 ...

  2. VI编辑器学习笔记

    VIM的使用 VI是Linux系统中的一种编辑器,它的使用方法和界面与Unix平台十分相似,掌握了VIM的特殊,你可以感觉到它强大的功能与高效.Vim 相对来说较小,无论你使用任何Linux系统,你总 ...

  3. 2016年31款轻量高效的开源JavaScript插件和库

    目前有很多网站设计师和开发者喜欢使用由JavaScript开发的插件和库,但同时面临一个苦恼的问题:它们中的大多数实在是太累赘而且常常降低网站的性能.其实,其中也有不少轻量级的插件和库,它们不仅轻巧有 ...

  4. Android 编程下的代码混淆

    什么是代码混淆 Java 是一种跨平台的.解释型语言,Java 源代码编译成中间”字节码”存储于 class 文件中.由于跨平台的需要,Java 字节码中包括了很多源代码信息,如变量名.方法名,并且通 ...

  5. Front End中Javascript兼容问题收集(转)

    1 select标签,就有诸多不兼容: A. cloneNode方法,对于非IE浏览器没有问题,对于IE浏览器, 遇到的问题包括:     1)option selected的会clone不过去,然后 ...

  6. ios基础篇(三)——UIButton的详细介绍

    按钮UIButton是ios开发中最常见的控件之一,下面来介绍UIButton的详细内容: 一.UIButton的定义 UIButton *button=[[UIButton buttonWithTy ...

  7. 时间序列数据库选型——本质是列存储,B-tree索引,抑或是搜索引擎中的倒排索引

    时间序列数据库最多,使用也最广泛.一般人们谈论时间序列数据库的时候指代的就是这一类存储.按照底层技术不同可以划分为三类. 直接基于文件的简单存储:RRD Tool,Graphite Whisper.这 ...

  8. JDE报表开发笔记(Client端导出Excel乱码)

    之前导出Excel时没发生任何问题, Client端PL/SQL字符集为UTF-8 Oracle JDE E910字符集为UTF-8 解决方式:添加指定用户的字符集(上图即为修改后的用户字符集) 角色 ...

  9. [转]Visual Studio 2010 单元测试目录

    Visual Studio 2010 单元测试共分七个部分: 普通单元测试.顺序单元测试.压力测试,Generic测试.数据库测试.UI界面测试和Web性能测试. 这个系列的博客实例程序可以在下面的链 ...

  10. 用Masonry实现键盘的收回和弹出

    首先说几点:我一般将数值类型的约束用mas_equalTo,而相对于某个控件,或者某个控件的某个约束,我会使用equalTo,如:make.size.mas_equalTo(CGSizeMake(10 ...