多线程——GCD
一、 GCD的基本概念
- GCD:强大的中枢调度,纯C语言,提供了非常多强大的函数。
- 任务(block):执行什么操作。
- 队列(queue):用来存放任务。
- 同步函数dispatch_sync():不创建新线程,在当前线程中顺序执行队列里的任务。
- 异步函数dispatch_async():创建新线程,在另一条线程中执行队列里的任务。
- 串行队列:任务一个接着一个有序的执行。
- 并发队列:让多个任务并发(同时)执行。
二、 队列
1. GCD中获得串行有2种途径
(1)使用dispatch_queue_create函数创建串行队列
(2)使用主队列(跟主线程相关联的队列)
// 手动创建
dispatch_queue_t queue = dispatch_queue_create("wendingding", NULL); // 获得主线程,主线程就是串行队列
dispatch_queue_t queue = dispatch_get_main_queue();
2. 获得并发队列
(1)使用dispatch_get_global_queue函数获得全局的并发队列
// 无需手动创建,从中枢调度系统中获取
ispatch_queue_t dispatch_get_global_queue((DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
(2)全局并发队列的优先级
- #define DISPATCH_QUEUE_PRIORITY_HIGH 2 // 高
- #define DISPATCH_QUEUE_PRIORITY_DEFAULT 0 // 默认(中)
- #define DISPATCH_QUEUE_PRIORITY_LOW (-2) // 低
- #define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN // 后台
三、 GCD的应用
1. 同步:
 - (void)viewDidLoad {
     [super viewDidLoad];
     // Do any additional setup after loading the view, typically from a nib.
     // 1. 创建串行队列
     dispatch_queue_t sQueue = dispatch_queue_create("sQueue", );
     // 2. 把3个任务加入串行队列,同步函数中执行
     dispatch_sync(sQueue, ^{
         NSLog(@"load1---%@", [NSThread currentThread]);
     });
     dispatch_sync(sQueue, ^{
         NSLog(@"load2---%@", [NSThread currentThread]);
     });
     dispatch_sync(sQueue, ^{
         NSLog(@"load3---%@", [NSThread currentThread]);
     });
     // 主线程,主线程是在同步函数中执行的
     NSLog(@"main---%@", [NSThread mainThread]);
 }
第一次运行结果:
-- ::32.711 -GCD[:] load1---<NSThread: 0x7b74e5a0>{number = , name = main}
-- ::32.711 -GCD[:] load2---<NSThread: 0x7b74e5a0>{number = , name = main}
-- ::32.712 -GCD[:] load3---<NSThread: 0x7b74e5a0>{number = , name = main}
-- ::32.712 -GCD[:] main---<NSThread: 0x7b74e5a0>{number = , name = main}
第二次运行结果:
-- ::40.913 -GCD[:] load1---<NSThread: 0x7e202070>{number = , name = main}
-- ::40.913 -GCD[:] load2---<NSThread: 0x7e202070>{number = , name = main}
-- ::40.914 -GCD[:] load3---<NSThread: 0x7e202070>{number = , name = main}
-- ::40.914 -GCD[:] main---<NSThread: 0x7e202070>{number = , name = main}
注解:由以上两次运行结果可知,同步函数不会创建新线程,故以上程序都是在默认线程,即主线程中执行,同步函数内的程序都是按顺序执行的。
2. 异步:
 - (void)viewDidLoad {
     [super viewDidLoad];
     // Do any additional setup after loading the view, typically from a nib.
     // 1. 获得并发队列
     dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, );
     // 2. 开3个线程,把3个任务加入队列,异步执行
     dispatch_async(queue, ^{
         NSLog(@"load1---%@", [NSThread currentThread]);
     });
     dispatch_async(queue, ^{
         NSLog(@"load2---%@", [NSThread currentThread]);
     });
     dispatch_async(queue, ^{
         NSLog(@"load3---%@", [NSThread currentThread]);
     });
     NSLog(@"main---%@", [NSThread mainThread]);
 }
第一次运行结果:
-- ::18.519 -GCD[:] load1---<NSThread: 0x79979100>{number = , name = (null)}
-- ::18.519 -GCD[:] load2---<NSThread: 0x79676d10>{number = , name = (null)}
-- ::18.520 -GCD[:] load3---<NSThread: 0x799782d0>{number = , name = (null)}
-- ::18.519 -GCD[:] main---<NSThread: 0x7996f180>{number = , name = main}
第二次运行结果:
-- ::40.791 -GCD[:] main---<NSThread: 0x79f15640>{number = , name = main}
-- ::40.791 -GCD[:] load3---<NSThread: 0x79f2bc90>{number = , name = (null)}
-- ::40.791 -GCD[:] load1---<NSThread: 0x7b8284a0>{number = , name = (null)}
-- ::40.791 -GCD[:] load2---<NSThread: 0x79e247e0>{number = , name = (null)}
第三次运行结果:
-- ::12.016 -GCD[:] load1---<NSThread: 0x7b61ead0>{number = , name = (null)}
-- ::12.016 -GCD[:] load3---<NSThread: 0x7d9113a0>{number = , name = (null)}
-- ::12.016 -GCD[:] load2---<NSThread: 0x7d822fa0>{number = , name = (null)}
-- ::12.016 -GCD[:] main---<NSThread: 0x7d809fc0>{number = , name = main}
注解:由运行结果可看出,异步函数会创建出3个新线程,并发队列里的任务不是按照顺序执行的,而是随机并发执行的。
总结:
- 并发队列只有放到异步函数里面执行才能得到并发的效果,即放到并发队列里的任务,不按照顺序,随机并发执行的。
- 并发队列如果放到同步函数里面执行,跟串行队列放到同步函数里面执行的效果是一样的,顺序执行。
- 同步队列放到异步函数里面执行,则队列里的任务都是顺序执行的。
多线程——GCD的更多相关文章
- iOS 多线程GCD的基本使用
		<iOS多线程简介>中提到:GCD中有2个核心概念:1.任务(执行什么操作)2.队列(用来存放任务) 那么多线程GCD的基本使用有哪些呢? 可以分以下多种情况: 1.异步函数 + 并发队列 ... 
- iOS多线程 GCD
		iOS多线程 GCD Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法. dispatch queue分成以下三种: 1)运行在主线程的Main que ... 
- 修改版: 小伙,多线程(GCD)看我就够了,骗你没好处!
		多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术.具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能.具有这种能力的系 ... 
- ios多线程-GCD基本用法
		ios中多线程有三种,NSTread, NSOperation,GCD 这篇就讲讲GCD的基本用法 平时比较多使用和看到的是: dispatch_async(dispatch_get_global_q ... 
- iOS 多线程GCD简介
		一.简介 1.1 GCD (Grand Central Dispatch )是Apple开发的一个多核编程的解决方法. Grand 含义是“伟大的.宏大的”,Central含义“中央的”,Dispat ... 
- 多线程GCD的基本使用以及注意点
		GCD的使用 一:队列 1.串行队列:添加到队列中的任务是一个一个执行的 2.并行(发)队列:添加到队列中的任务是多个同时执行的(一个队列中的多个任务可以同时执行) 3.主队列:里 ... 
- IOS开发之多线程 -- GCD的方方面面
		前言:这篇GCD的博文是本人阅读了很多海内外大神的关于GCD的文章,以及结合之前自己对GCD的粗浅的认识,然后取其精华,去其槽粕,综合起来的笔记,而且是尽可能的以通熟易懂的并且是正确的理论论述方式呈现 ... 
- 刀哥多线程GCD核心概念gcd
		GCD GCD 核心概念 将任务添加到队列,并且指定执行任务的函数 任务使用 block 封装 任务的 block 没有参数也没有返回值 执行任务的函数 异步 dispatch_async 不用等待当 ... 
- ios开发多线程--GCD
		引言 虽然GCD使用很广,而且在面试时也经常问与GCD相关的问题,但是我相信深入理解关于GCD知识的人肯定不多,大部分都是人云亦云,只是使用过GCD完成一些很简单的功能.当然,使用GCD完成一些简单的 ... 
- 多线程GCD
		经常使用:规避很多线程相关的复杂的逻辑 为什么会gcd?因为pthread和nsthread要求开发人员对线程相关的知识了解深入; 手动启动线程:加锁/解锁;造成很多隐患 --> 苹果公司给出了 ... 
随机推荐
- JS中exec函数与match函数的区别与联系
			总结: 正则规则的声明,两种方法: exec是RegExp类的匹配方法 match是字符串类的匹配方法 var reg = /aaa/g; var reg = new RegExp("aaa ... 
- 借助HTML分别禁用IE8, IE9的兼容视图模式的小技巧
			IE 添加了兼容模式,开启后会以低一版本的 IE 进行渲染,但是我就遇到了一种情况,在 IE8 下只有不使用兼容模式页面才能显示正常,下面有个不错的方法可以解决这个问题 从 IE 8 开始,IE 添加 ... 
- Dell R410 broadcom网卡驱动更新失败
			问题描述: 最近遇到一个Dell R410 broadcom网卡驱动更新失败的问题.从官网上下载的驱动在安装的过程中都会自己回滚回来,很是困惑. 尝试解决: Dell官网现在提供的驱动一般最少有两种格 ... 
- MSSQL update 多表关联更新
			update tMeter set 字段= t.源自段 from ( select * from 源表信息 ) t where 关联条件 实际demo: UPDATE dbo.WX_TWODIMENC ... 
- ASP.net中网站访问量统计方法代码(在线人数,本月访问,本日访问,访问流量,累计访问)
			一.建立一个数据表IPStat用于存放用户信息 我在IPStat表中存放的用户信息只包括登录用户的IP(IP_Address),IP来源(IP_Src)和登录时间 (IP_DateTime),些表的信 ... 
- 黄聪:深入理解PHP Opcode缓存原理
			什么是opcode缓存? 当解释器完成对脚本代码的分析后,便将它们生成可以直接运行的中间代码,也称为操作码(Operate Code,opcode).Opcode cache的目地是避免重复编译,减少 ... 
- GL_GL系列 - 日记账处理管理分析(案例)
			2014-07-07 Created By BaoXinjian 
- memcache 内部原理实现
			Lazy Expiration memcached 内部不会监视记录是否过期,而是在 get 时查看记录的时间戳,检查记录是否过期.这 种技术被称为 lazy(惰性)expiration.因此,mem ... 
- java web 插件式开发
			1.支持pagelet2.菜单扩展3.静态文件访问 4.开发环境. 5.OSGi平台. tms:pagelet 是一个jsp标签 <div> <tms:pagelet show=&q ... 
- StringIO 模块用于在内存缓冲区中读写数据
			模块是用类编写的,只有一个StringIO类,所以它的可用方法都在类中.此类中的大部分函数都与对文件的操作方法类似. 例: #coding=gbk import StringIO s=StringIO ... 
