2016 - 1 -17 GCD学习总结
一: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学习总结的更多相关文章
- 2016 - 1 -17 GCD主队列与全局队列
一:主队列 1.概念:每一个应用程序对应唯一一个主队列,直接GET即可:在多线程开发中,使用主队列更新UI dispatch_queue_t q = dispatch_get_main_queue() ...
- GCD学习 —— 三
学习学习dispatch_block,在向队列中添加任务时,可以直接在对应的函数中添加 block.但是如果想对任务进行操作,比如监听任务.取消任务,就需要获取对应的 block. 1 创建Blo ...
- 更新日志(建议升级到2016.12.17) && 更新程序的方法
更新程序的方法: 1,在控制面板里点击备份当前数据库文件到磁盘,把当天获取的信息从内存写到磁盘/存储卡.2,下载最新版的源码 wget -O "infopi.zip" " ...
- 2018面向对象程序设计(Java)第17周学习指导及要求
2018面向对象程序设计(Java)第17周学习指导及要求(2018.12.20-2018.12.23) 学习目标 (1) 掌握线程同步的概念及实现技术: (2) Java线程综合编程练习 学习资 ...
- 《Think Python》第17章学习笔记
目录 <Think Python>第17章学习笔记 17.1 面向对象的特性(Object-oriented features) 17.2 打印对象(Printing objects) 1 ...
- Murano Weekly Meeting 2016.05.17
Meeting time: 2016.May.17 1:00~2:00 Chairperson: Kirill Zaitsev, from Mirantis Meeting summary: 1 ...
- 2016.8.17上午纪中初中部NOIP普及组比赛
2016.8.17上午纪中初中部NOIP普及组比赛 链接:https://jzoj.net/junior/#contest/home/1335 本来觉得自己能考高分,但只得160分,并列第九.至少又挤 ...
- 2016.9.17初中部下午NOIP普及组比赛总结
2016.9.17初中部下午NOIP普及组比赛总结 2016.09.17[初中部 NOIP普及组 ]模拟赛 最近几次的题目都不是自己擅长的啊... 不过含金量挺高的,也好... 进度: 比赛:0+0+ ...
- Dreamweaver学习笔记---2016.08.17
静态网页:不访问数据库,直接写入HTML. 动态网页:在网上发布好的,我们可以通过网页预览到的,具有访问数据库的过程. HTML:Hyper Text Markup Language,超文本语音标记. ...
随机推荐
- 打通B/S与C/S !让HTML5 WebSocket与.NET Socket公用同一个服务端!
随着HTML5 WebSocket技术的日益成熟与普及,我们可以借助WebSocket来更加方便地打通BS与CS -- 因为B/S中的WebSocket可以直接连接到C/S的服务端,并进行双向通信.如 ...
- div 自适应高度 自动填充剩余高度
方案1: Html: <div class="outer"> <div class="A"> 头部DIV </div> &l ...
- S2 第二章数据库的实现
实现增删改查代码 1 select * from student --增加数据 insert into student (name,banji,xuehao) values(,) --修改数据 upd ...
- IO流--字符流
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java ...
- 20145236 《Java程序设计》第4周学习总结
20145236 <Java程序设计>第4周学习总结 教材学习内容总结 第六章 继承与多态 一.继承 •继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类.继承可以理解 ...
- express+nodecoffee写passport登录验证实例(二)
二:实现登录认证 passport官网文档: http://passportjs.org/guide/ passport验证使用一种被称为“策略”的方式来验证请求,策略支持3种类型的验证:用户名密码 ...
- c# xml的增删改查操作 xmlDocument 的用法
1.将xml转换为DataTable string path = "";//xml的位置StringReader sr = null;XmlTextReader xmlReader ...
- js——常见的小方法
1.随机得到是六位数,可以当做“密码”来使用: Math.random().toString().substr(2, 6):
- java网络编程socket解析
转载:http://www.blogjava.net/landon/archive/2013/07/02/401137.html Java网络编程精解笔记2:Socket详解 Socket用法详解 在 ...
- 解析网络json数据,模拟美团界面显示。
<?xml version="1.0" encoding="UTF-8"?> <RelativeLayout xmlns:android=&q ...