iOS —— 多线程GCD
一、什么是GCD
1.GCD是苹果为解决多线程而定义的一套库,并且GCD可以自动管理线程的生命周期,就可ARC类似,不需要我们手动去管理
2.GCD是用纯C语言写的,所以我门使用的是GCD中的函数,并不是面向对象的方法
3.GCD核心概念
1)任务:就是某个线程要执行的方法
2)队列:存放所有的任务
4.GCD使用步骤
1)确定要执行的任务
2)将任务添加到队列中,GCD会自动将队列中的任务取出,放在对应的线程中去执行
5.同步异步
1)同步:在同一个线程中执行任务,不会创建新的线程
//同步函数
//参数1:队列
//参数2:任务的代码块
dispatch_sync(dispatch_queue_tqueue,DISPATCH_NOESCAPEdispatch_block_tblock);
复制代码
2)异步:创建一个新的线程,并在新的线程中执行任务
//异步函数
//参数1:队列
//参数2:任务的代码块
dispatch_async(dispatch_queue_tqueue,dispatch_block_tblock);
复制代码
6.队列队列可分为两种
1)异步队列:即并行执行的队列,队列中的每个任务都可以并发(同步)执行
2)串行队列:即串行执行的队列,队列中的每个任务需要串行执行,即一个一个来
获得队列
//创建串行队列
//参数1:队列名称,C风格字符串
//参数2:队列的属性,一般用NULL即可
dispatch_queue_tdispatch_queue_create(constchar*_Nullablelabel,dispatch_queue_attr_t_Nullableattr);
复制代码
dispatch_queue_t是队列的类型
//获得主队列,主队列是一个串行队列,并且与主线程对应,主队列中的任务都会被主线程执行
dispatch_queue_tdispatch_get_main_queue(void);
复制代码
//全局并发队列,可以供整个应用使用,不需手动创建
//参数1:队列的优先级(有4个)
//#defineDISPATCH_QUEUE_PRIORITY_HIGH2高优先级
//#defineDISPATCH_QUEUE_PRIORITY_DEFAULT0默认
//#defineDISPATCH_QUEUE_PRIORITY_LOW(-2)低优先级
//参数2:队列的属性,可以穿0
dispatch_queue_tdispatch_get_global_queue(longidentifier,unsignedlongflags);
复制代码
二、GCD基础应用
1.异步/同步函数与串行/并行队列
1)使用异步函数向并发队列中添加任务
//1.打印主线程
NSLog(@"主线程---%@",[NSThreadcurrentThread]);
//2.获取全局并发队列,并设置优先级为默认
dispatch_queue_tqueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
//3.添加任务到并行队列中,就可以执行任务了
//使用异步函数添加任务,可以开启新的线程
dispatch_async(queue,^{
NSLog(@"任务1---%@",[NSThreadcurrentThread]);
});
dispatch_async(queue,^{
NSLog(@"任务2---%@",[NSThreadcurrentThread]);
});
dispatch_async(queue,^{
NSLog(@"任务3---%@",[NSThreadcurrentThread]);
});
复制代码
运行结果
333.png
总结:可以看出,除了主线程之外,还分别创建了三个子线程,并且三个子线程是并发执行的
2)使用异步函数向串行队列中添加任务
//1.创建串行队列
//参数1:串行队列的名称,是C风格字符串
//参数2:串行队列的属性,一般来说串行队列是不需要任何属性,可以传NULL
dispatch_queue_tqueue=dispatch_queue_create("Chuanxin",NULL);
NSLog(@"主线程---%@",[NSThreadcurrentThread]);
//2.使用异步函数往串行队列中添加任务
dispatch_async(queue,^{
NSLog(@"任务1---%@",[NSThreadcurrentThread]);
});
dispatch_async(queue,^{
NSLog(@"任务2---%@",[NSThreadcurrentThread]);
});
dispatch_async(queue,^{
NSLog(@"任务3---%@",[NSThreadcurrentThread]);
});
复制代码
运行结果
4444.png
总结:使用异步函数向串行队列中添加任务时,会开启新的线程,但是只会开启一个;因为串行队列中的任务需要一个一个执行,不必同时执行,所以只会创建一个新新线程
3)使用同步函数向并行队列中添加任务
NSLog(@"主线程---%@",[NSThreadcurrentThread]);
//1.获取全局的并行队列,并设置优先级为默认
dispatch_queue_tqueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
//2.使用同步函数往并行队列中添加任务
dispatch_sync(queue,^{
NSLog(@"任务1---%@",[NSThreadcurrentThread]);
});
dispatch_sync(queue,^{
NSLog(@"任务2---%@",[NSThreadcurrentThread]);
});
dispatch_sync(queue,^{
NSLog(@"任务3---%@",[NSThreadcurrentThread]);
});
复制代码
运行结果
555.png
555.png(44.47KB,下载次数:0)
下载附件
5秒前上传
总结:因为使用的是同步函数,所以不会创建新的线程,所以都是在主线程中执行;此时,并发队列就失去了其功能,因为都没有新的线程创建,何谈并发
原文链接:http://bbs.jointforce.com/topic/26514