一、概念回顾

1、GCD全称 Grand Central Dispatch ,是纯C语言,提供了非常多强大的函数,来进行系统线程的管理。

2、优势:GCD是苹果公司为多核的并行运算提出的解决方案。GCD会自动利用更多的CPU内核,会自动管理线程的生命周期(创建线程、调度任务、销毁线程),程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码。

3、GCD的两个核心:

(1)队列:GCD会从队列中取出任务,按照不同情况,放到对应的线程中执行,遵循FIFO原则。

   队列共分有四种:

  a、串行 :任务一个接一个的执行。

  b、并发 :可以让任务同时执行,就是开启多个线程执行任务。

  c、全局 :本质就是并发队列,区别:没有名称,不可跟踪;在MRC中释放次数不一样。

  通过函数 dispatch_get_global_queue(<#long identifier#>, <#unsigned long flags#>)获得,第一个参数是优先级,第二个是预留(无用),一般二者都设为0。

  d、主队列 :在主线程中顺序执行,有死锁现象(主队列同步执行的情况)。

(2)任务:就是要处理的事情。

任务处理(操作)方式有两种

   a、同步 :在当前线程执行,不开辟新的线程。

   b、异步 :在新的线程中执行任务,可以开启新的一条或多条线程。

4、队列和任务执行方式的组合

5、死锁描述:向串行队列里面分派同步任务(dispatch_sync)

二、实验观察线程管理情况

各种情况都写在viewDidLoad中,需要时打开注释,方便比较和查阅

- (void)viewDidLoad {
[super viewDidLoad]; //串行队列
dispatch_queue_t serial = dispatch_queue_create("serial", DISPATCH_QUEUE_SERIAL);
//并行队列
dispatch_queue_t concurrent = dispatch_queue_create("concurrent", DISPATCH_QUEUE_CONCURRENT);
//创建block1
dispatch_block_t block1 = ^{ //特意将第一个任务延迟一秒,用来观察执行顺序
[NSThread sleepForTimeInterval:];
NSLog(@" block1 ==> %@",[NSThread currentThread]);
};
//创建block2
dispatch_block_t block2 = ^{
NSLog(@" block2 ==> %@",[NSThread currentThread]);
}; #pragma mark - 串行同步 :在当前线程,FIFO顺序执行任务
// dispatch_sync(serial, block1);
// dispatch_sync(serial, block2); #pragma mark - 串行异步 :新建一个线程,出队列后按FIFO顺序执行
// dispatch_async(serial, block1);
// dispatch_async(serial, block2); #pragma mark - 并发同步 :在当前线程,出队列后顺序执行
// dispatch_sync(concurrent, block1);
// dispatch_sync(concurrent, block2); #pragma mark - 并发异步 :创建N个新线程,出队列后随机(同时)执行
// dispatch_async(concurrent, block1);
// dispatch_async(concurrent, block2); #pragma mark - 全局同步 :类似并发同步,全局队列是通过函数获得的
// dispatch_sync(dispatch_get_global_queue(0, 0), block1);
// dispatch_sync(dispatch_get_global_queue(0, 0), block2); #pragma mark - 全局异步 :类似并发异步
// dispatch_async(dispatch_get_global_queue(0, 0), block1);
// dispatch_async(dispatch_get_global_queue(0, 0), block2); #pragma mark - 主队列同步(死锁):主线程等待主队列中任务执行完毕(一直挂起,不是空闲)后面的代码都无法运行,然而主队列中的任务又在等待主线程空闲(也一直挂起,等待着主线程可以闲下来),所有两者相互等待,形成死锁。
// dispatch_sync(dispatch_get_main_queue(), block1);
// dispatch_sync(dispatch_get_main_queue(), block2); #pragma mark - 主队列同步(解死锁):加上一个全局异步,这样主线程不会卡住,主线程可以执行完它的代码,回过头来(此时空闲了),处理主队列里面的任务,不会锁死。
// dispatch_async(dispatch_get_global_queue(0, 0), ^{
// NSLog(@"我是解锁的开始,此时线程 ===》%@ ",[NSThread currentThread]);
// dispatch_sync(dispatch_get_main_queue(), block1);
// dispatch_sync(dispatch_get_main_queue(), block2);
// NSLog(@"死锁被解开了!!%@ ",[NSThread currentThread]);
// }); #pragma mark - 主队列异步 : 主线程空闲时才执行主队列中的内容,出队列顺序执行 // dispatch_async(dispatch_get_main_queue(), block1);
// dispatch_async(dispatch_get_main_queue(), block2); NSLog(@" (主线程)我是写在程序最后的 =====》 end");
}

贴上几种组合的执行结果图(不是所有)

1、串行异步

2、并发同步

3、主队列同步 (解开死锁的情况)

4、主队列异步

三、总结

GCD管理线程,功能强大:有没有新线程看是否同步——异步;有没有顺序执行看是否串行——并行。

还有多种线程管理的方式:pthread、NSThread、NSOperation(NSInvocationOperation、NSBlockOperation),各有优缺点,以及使用的场景,以后再做讨论。

GCD中各种队列和任务执行方式的组合的更多相关文章

  1. iOS 关于GCD中的队列

    GCD中队列分类及获得方式 1.串行队列  dispatch_queue_t queue = dispatch_queue_create("队列名", DISPATCH_QUEUE ...

  2. 关于OC中的几种延迟执行方式

    第一种: [UIView animateWithDuration: delay: options: animations:^{ self.btn.transform = CGAffineTransfo ...

  3. 读书笔记——spring cloud 中 HystrixCommand的四种执行方式简述

    读了<Spring Cloud 微服务实战>第151-154页, 总结如下: Hystrix存在两种Command,一种是HystrixCommand,另一种是HystrixObserva ...

  4. shell中sparksql语句调试、执行方式

    1.命令方式执行sparksql查询 SQL="use mydatatable;;select count(1) from tab_videousr_onlne where p_regiio ...

  5. iOS多线程中,队列和执行的排列组合结果分析

    本文是对以往学习的多线程中知识点的一个整理. 多线程中的队列有:串行队列,并发队列,全局队列,主队列. 执行的方法有:同步执行和异步执行.那么两两一组合会有哪些注意事项呢? 如果不是在董铂然博客园看到 ...

  6. IOS中延时执行方式

    本文列举了四种延时执行某函数的方法及其一些区别.假如延时1秒时间执行下面的方法. - (void)delayMethod { NSLog(@"execute"); } 1.perf ...

  7. Lua中实现队列(高效方式)

    转自http://www.cnblogs.com/stephen-liu74/archive/2012/06/25/2417894.html 在Lua中实现队列的简单方法是使用table库函数inse ...

  8. Delphi中ADO异步执行方式

    当ADO开始处理数据后,应用程序必须等到ADO处理完毕之后才可以继续执行.但是除了同步执行方式之外,ADO也提供了异步执行的方式,允许当ADO处理时,应用程序仍然能够先继续执行.而当ADO处理数据完毕 ...

  9. shell基础概念, if+命令, shell中引用python, shell脚本的几种执行方式

    说明: 虚拟机中shell_test目录用来练习shell, 其中有个test.log文件用来存放日志 #!/usr/bin/bash      # shell文件开头, 用来指定该文件使用哪个解释器 ...

随机推荐

  1. //……关于HTTP与HTTPS

    图1 图2 第一张访问域名http://www.tsinghua.edu.cn,谷歌浏览器提示不安全链接,第二张是https://www.12306.cn/index,浏览器显示安全,为什么会这样子呢 ...

  2. jquery 点击弹框

    <a href="#" class="big-link" data-reveal-id="myModal" data-animatio ...

  3. Jupyter notebook使用笔记

    常用快捷键 For a Cell,   Blue -> selecting. Green -> editing. Esc -> exist edit When the cell is ...

  4. codeforces 362B

    #include<stdio.h> #include<stdlib.h> int cmp(const void *a,const void *b) { return *(int ...

  5. 【IntelliJ】IDEA使用--字体、编码和基本设置

    IDEA这么高端的工具之前只是断断续续使用了一下,因为项目的开发都是在eclipse上,每次学习IDEA的使用都得上网搜索半天,今天自己整理一下,方便以后查阅. IDEA版本15.0.4 字体 界面字 ...

  6. linux 常见名词及命令(六)

    查看软件安装位置 : dpkg -L 软件包名字 ubuntu环境的apache相关命令: 查看是否启动:ps -aux | grep httpd  或者 netstat -an | grep :80 ...

  7. Network -UVa315(连通图求割点)

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=5&page=sh ...

  8. Session&Cookie 的介绍和使用

    Session介绍与使用 1.Session基本介绍 Session:在计算机中,尤其是在网络应用中,称为“会话控制”.Session 对象存储特定用户会话所需的属性及配置信息.这样,当用户在应用程序 ...

  9. Ubuntu 16.04 GNOME无法使用拼音输入法问题

    说明:添加好之后重启!不然会出现输入错乱的问题. 参考: http://forum.ubuntu.org.cn/viewtopic.php?t=477765

  10. oracle 11g GRID 中 关于 OLR 须要知道的一些内容

     oracle 11g GRID 中 关于 OLR 须要知道的一些内容 1.检查olr 的状态: [root@vmrac1 ~]# ocrcheck -local Status of Oracle ...