iOS —— 多线程GCD

iOS开发分享交流 2017-04-19

一、什么是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

相关推荐