2016 - 1 -17 GCD主队列与全局队列
一:主队列
1.概念:每一个应用程序对应唯一一个主队列,直接GET即可;在多线程开发中,使用主队列更新UI
dispatch_queue_t q = dispatch_get_main_queue();
2.特性:首先是一个程序里只有唯一一个主队列,专门负责调度主线程里的任务,不会允许开辟新的线程。主队列也是串行队列。
比如在主队列中的异步任务,虽然是异步的,但任务们最终都只在主线里执行,代码如下:
- (void)test5{
// 获得主队列(每一个应用程序中对应唯一一个主队列)
dispatch_queue_t queue = dispatch_get_main_queue();
NSLog(@"开始!!");
for (int i = ; i < ; i ++) {
dispatch_async(queue, ^{
NSLog(@"当前操作咋%@线程 --- 任务号 = %d",[NSThread currentThread],i);
});
}
NSLog(@"结束"); }
打印结果:
2016-01-17 22:14:04.658 wdqdqw[14457:1222706] 开始!!
2016-01-17 22:14:04.659 wdqdqw[14457:1222706] 结束
2016-01-17 22:14:04.659 wdqdqw[14457:1222706] 当前操作咋<NSThread: 0x7fa698d09ef0>{number = 1, name = main}线程 --- 任务号 = 0
2016-01-17 22:14:04.659 wdqdqw[14457:1222706] 当前操作咋<NSThread: 0x7fa698d09ef0>{number = 1, name = main}线程 --- 任务号 = 1
2016-01-17 22:14:04.659 wdqdqw[14457:1222706] 当前操作咋<NSThread: 0x7fa698d09ef0>{number = 1, name = main}线程 --- 任务号 = 2
2016-01-17 22:14:04.660 wdqdqw[14457:1222706] 当前操作咋<NSThread: 0x7fa698d09ef0>{number = 1, name = main}线程 --- 任务号 = 3
2016-01-17 22:14:04.660 wdqdqw[14457:1222706] 当前操作咋<NSThread: 0x7fa698d09ef0>{number = 1, name = main}线程 --- 任务号 = 4
2016-01-17 22:14:04.660 wdqdqw[14457:1222706] 当前操作咋<NSThread: 0x7fa698d09ef0>{number = 1, name = main}线程 --- 任务号 = 5
2016-01-17 22:14:04.660 wdqdqw[14457:1222706] 当前操作咋<NSThread: 0x7fa698d09ef0>{number = 1, name = main}线程 --- 任务号 = 6
2016-01-17 22:14:04.660 wdqdqw[14457:1222706] 当前操作咋<NSThread: 0x7fa698d09ef0>{number = 1, name = main}线程 --- 任务号 = 7
2016-01-17 22:14:04.686 wdqdqw[14457:1222706] 当前操作咋<NSThread: 0x7fa698d09ef0>{number = 1, name = main}线程 --- 任务号 = 8
2016-01-17 22:14:04.686 wdqdqw[14457:1222706] 当前操作咋<NSThread: 0x7fa698d09ef0>{number = 1, name = main}线程 --- 任务号 = 9
会发现一个很有意思的现象,只有在test5这个函数执行完毕后,才会调用任务里的内容(也就是block里的内容),原因如下:
一个线程只能同时执行一个任务,当前主线程在异步任务被放进主队列里后,由于是异步任务,不会立马执行,就会先执行test5这个函数,等函数执行完毕了,主线程才会继续执行主队列里的任务,于是出现了上面的 先打印”开始“”结束“在打印任务号等等。
需要注意的是,如果吧上面的任务改为同步任务,也就是说需要立马执行,那么主线程就会阻塞。原因如下:
如果是同步任务,那么队列里的任务就需要立马到主线里去执行。但是由于主线程里的test5还没执行完,同步任务就会没法到主线程里去。而test5又必须等同步任务执行完(同步任务必须立即被执行),他才会能执行完毕,所以造成了死锁,堵塞了主线程。
二:全局队列
1.概念:是一个并行队列 ,与主队列类似,使用get方法即可获得
dispatch_get_global_queue;
2.特性:与创建的并行队列相比较:
2.1.全局队列没有名称,但创建的有。
2.2.全局队列是所有程序共享的。
2.3.在MRC中,并行队列需要手动释放,而全局队列不需要。
2016 - 1 -17 GCD主队列与全局队列的更多相关文章
- IOS多线程知识总结/队列概念/GCD/主队列/并行队列/全局队列/主队列/串行队列/同步任务/异步任务区别(附代码)
进程:正在进行中的程序被称为进程,负责程序运行的内存分配;每一个进程都有自己独立的虚拟内存空间 线程:线程是进程中一个独立的执行路径(控制单元);一个进程中至少包含一条线程,即主线程 队列 dispa ...
- 2016 - 1 -17 GCD学习总结
一:GCD中的两个核心概念,队列与任务: 1.任务:执行什么操作.(代码块 block) 任务执行的类型分为以下两种: 1.1同步执行任务:在当前线程执行任务.不会开辟新的线程. 1.2异步执行任务: ...
- 更新日志(建议升级到2016.12.17) && 更新程序的方法
更新程序的方法: 1,在控制面板里点击备份当前数据库文件到磁盘,把当天获取的信息从内存写到磁盘/存储卡.2,下载最新版的源码 wget -O "infopi.zip" " ...
- 【原】iOS多线程之异步任务+并行队列情况与异步任务+串行队列(主队列)情况
异步任务+并行队列 把异步任务放到并行队列进行执行,异步任务会在不同的线程中执行. /*异步执行+并行队列*/ - (IBAction)clickBasic1:(UIButton *)sender { ...
- 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+ ...
- IOS 主队列,全局队列的关系
同步,异步,串行,并发 同步和异步代表会不会开辟新的线程.串行和并发代表任务执行的方式. 同步串行和同步并发,任务执行的方式是一样的.没有区别,因为没有开辟新的线程,所有的任务都是在一条线程里面执行. ...
- GCD调度组、自定义队列来实现多个下载任务
#define KURL1 @"http://img0.imgtn.bdimg.com/it/u=79920747,2237302485&fm=90&gp=0.jpg&quo ...
随机推荐
- linux笔记:搜索命令find,locate,which,whereis,grep
命令名称:find功能:文件搜索命令所在路径:/bin/find用法:find 搜索范围 匹配条件其他:举例:find /root -name initfind /root -size +1024fi ...
- jq手风琴---点击时列表的左边距逐渐减小
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- python 练习 27
ython continue 语句跳出本次循环,而break跳出整个循环. continue 语句用来告诉Python跳过当前循环的剩余语句,然后继续进行下一轮循环. continue语句用在whil ...
- Datatable的Select()方法简介
DataTable是我们在进行开发时经常用到的一个类,并且经常需要对DataTable中的数据进行筛选等操作,下面就介绍一下Datatable中经常用到的一个方法——Select,微软提供了四个函数的 ...
- AJAX是什么? AJAX的交互模型(流程)?同步和异步的区别? AJAX跨域的解决办法?
AJAX是什么? AJAX的交互模型(流程)?同步和异步的区别? AJAX跨域的解决办法? 分类: web前端面试题2013-07-20 22:40 630人阅读 评论(0) 收藏 举报 目录(? ...
- mark 一下
Android资源管理框架(Asset Manager)简要介绍和学习计划 http://www.cnblogs.com/hjtdlx/p/4332060.html
- 让DIV实现抖动效果!
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- Assert断言测试
assert编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设,可以将断言看作是异常处理的一种高级形式.断言表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真.可以在 ...
- How to Run a .Jar Java File
.jar files are used for archiving, archive unpacking. One of the essential features of jar file is l ...
- bzoj3594: [Scoi2014]方伯伯的玉米田
dp新优化姿势... 首先,当我们拔高时,一定右端点是n最优.因为如果右端点是r,相当于降低了r之后玉米的高度.显然n更优. 那么可以dp.dp[i][j]表示前i个拔高j次的LIS.dp[i][j] ...