一: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. 设置DIV最小高度以及高度自适应随着内容的变化而变化

    <!--退租账单--> <div id="bilsli" onmouseover="showBill(this)"> #bilsli{ ...

  2. kellogg项目总结

    1.题目的去随机值去重 (当时做的是每次点击取出一个随机数,并删除数组中位置,后来改成获取10个随机数组成的数组,二者略有差距,修改颇长时间) function getArr(num){ totalA ...

  3. --专访雷果国: 从1.5K到18K 一个程序员的5年成长之路--

    导语:今年三月份,在CSDN博客和新浪微博上有一篇<从1.5K到18K,一个程序员的5年成长之路>被众人分享和传阅,这篇博文首先介绍了作者自学之初薄弱的基础,然后通过流水账形式分享了那个从 ...

  4. form表单提交过程

    本文为转载文章! 今天,我将站在HTML和单纯的Asp.net框架的角度来解释它们的工作方式,因此,本文不演示WebForms服务器控件的相关内容. 简单的表单,简单的处理方式 好了,让我们进入今天的 ...

  5. 必须关注的25位知名JavaScript开发者

    必须关注的25位知名JavaScript开发者 发表于2012-08-07 17:30| 16215次阅读| 来源Crossrider Blog| 46 条评论| 作者Crossrider Blog ...

  6. Extjs 视频教程

    ---恢复内容开始--- 网易云课堂 <尚学堂_Ext视频教程> login.html <html> <head> <meta http-equiv=&quo ...

  7. Android开发--环境配置

    1.下载android adt和sdk adt: 新建链接http://dl.google.com/android/ADT-xx.x.x.zip下载adt 注:xx为需要下载adt的版本号,可以在官网 ...

  8. 230. Kth Smallest Element in a BST ——迭代本质:a=xx1 while some_condition: a=xx2

    Given a binary search tree, write a function kthSmallest to find the kth smallest element in it. Not ...

  9. 使用2个MR计算

    转载:http://www.cnblogs.com/sharpxiajun/p/5205496.html 最近做了一个小的mapreduce程序,主要目的是计算环比值最高的前5名,本来打算使用spar ...

  10. VS构建工具介绍

    VS构建工具介绍 我们都知道C/C++源代码要生成可执行的.exe程序,需要经过编译.链接的过程.你在VS工具中只需要选择菜单Build或按一下F5可以编译.链接.运行了,其实IDE帮我隐藏了好多的具 ...