博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
GCD的简单使用<一>
阅读量:6325 次
发布时间:2019-06-22

本文共 2871 字,大约阅读时间需要 9 分钟。

hot3.png

为了简化多线程应用的开发,iOS提供了GCD来实现多线程。GCD 的两个核心概念:

1.队列

队列负责管理开发者提交的任务,GCD始终以(FIFO)先进先出的方式处理任务。但是由于任务的执行时间并不相同,因此先处理的任务不一定先结束。队列分为串行队列和并行队列,串行队列每次只能处理一个任务,必须前一个任务完成之后,才能执行下一个任务;并发队列可以同时处理多个任务,因此将会有多个任务并发执行。

队列的底层会维护一个线程池来处理用户提交的任务,线程池的作用就是处理队列管理的任务。串行队列底层的线程池只需要维护一个线程即可,并发队列的底层则需要维护多个线程。

2.任务

任务就是用户提交给队列的工作单元,这些任务会提交给队列底层维护的线程池来执行,这些任务会意多线程的方式执行。

创建队列

1、获取系统默认的全局并发队列

dispatch_queue_t queue = dispatch_get_global_queue(<#long identifier#>, <#unsigned long flags#>)

参数1为队列的优先级,有这四个可选:

DISPATCH_QUEUE_PRIORITY_HIGH 2

 DISPATCH_QUEUE_PRIORITY_DEFAULT 0

 DISPATCH_QUEUE_PRIORITY_LOW (-2)

 DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN

参数2为系统预留参数,一般写 0。

2、 获取主线程关联的串行队列

dispatch_queue_t queue1 = dispatch_get_main_queue();

如果将任务提交到这个队列,就相当于在程序的主线程中执行。

3、//创建串行队列

dispatch_queue_t serialQueue = dispatch_queue_create("queue", DISPATCH_QUEUE_SERIAL);

将多任务提交到这个串行队列,多任务只能按顺序执行,必须等前一个任务完成后,才能开始执行下一个任务。

4、创建并行队列

dispatch_queue_t concurrentQueue = dispatch_queue_create("queue",DISPATCH_QUEUE_CONCURRENT);

将多任务提交给并发队列,并发队列可以按FIFO的顺序启动多个并发的执行任务,由于任务耗时长短不同,因此完成的顺序不能确定。

得到队列之后,接下来可以将任务交给队列,并由队列底层管理的线程池来执行这些任务

1.异步提交任务

1>串行队列

//串行队列serialQueue = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_SERIAL);//讲两个代码快提交给串行队列,第一个执行完成之后才会执行第二个    //提交任务1    dispatch_async(serialQueue, ^{        for (int i = 0; i < 100; i ++) {            NSLog(@" 111111 --  %d",i);        }    });    //提交任务2    dispatch_async(serialQueue, ^{        for (int i = 0; i < 100; i ++) {            NSLog(@" 222222 --  %d",i);        }    });

查看执行的结果:

可见,任务是按照顺序执行的。

2>并行队列

//并行队列dispatch_queue_t concurrentlQueue;    //讲两个代码快提交给并行队列,两个队列并发执行    //提交任务1    dispatch_async(concurrentlQueue, ^{        for (int i = 0; i < 100; i ++) {            NSLog(@" 111111 --  %d",i);        }    });    //提交任务2    dispatch_async(concurrentlQueue, ^{        for (int i = 0; i < 100; i ++) {            NSLog(@" 222222 --  %d",i);        }    });

查看执行的结果:

可见,两个任务是并发执行的。

2.同步提交任务

dispatch_sync()函数会以同步的方式提交代码块,该函数必须等到代码块执行结束才会返回。如果程序使用改函数提交了两个代码块(即使是并发队列),也必须等第一个任务完成才执行第二个任务。

1>串行队列

dispatch_queue_t serialQueue;  //两个代码快提交给串行队列,第一个执行完成之后才会执行第二个    //同步提交任务1 串行队列    dispatch_sync(serialQueue, ^{        for (int i = 0; i < 100; i ++) {            NSLog(@" 111111 --  %d",i);        }    });    //同步提交任务2 串行队列    dispatch_sync(serialQueue, ^{        for (int i = 0; i < 100; i ++) {            NSLog(@" 222222 --  %d",i);        }    });

查看执行的结果:

可见任务还是一个个执行,等前一个完成之后才会执行下一个;

2>并行队列

dispatch_queue_t concurrentlQueue;//两个代码快提交给并行队列,两个队列并发执行    //同步提交任务1 并行队列    dispatch_sync(concurrentlQueue, ^{        for (int i = 0; i < 100; i ++) {            NSLog(@" 111111 --  %d",i);        }    });    //同步提交任务2 并行队列    dispatch_sync(concurrentlQueue, ^{        for (int i = 0; i < 100; i ++) {            NSLog(@" 222222 --  %d",i);        }    });

查看执行的结果:

可见同步提交的任务,即使是并行队列,任务还是一个个的执行。

转载于:https://my.oschina.net/onlysimple/blog/731871

你可能感兴趣的文章
objective-c宏定义
查看>>
大型网站技术架构(七)网站的可扩展性架构
查看>>
Java基础学习总结(23)——GUI编程
查看>>
基于LNMP实现zabbix环境搭建
查看>>
Hadoop can't load native lib
查看>>
MyBatis学习总结(二)——使用MyBatis对表执行CRUD操作
查看>>
JavaScript学习总结(4)——JavaScript数组
查看>>
大型网站技术架构(八)网站的安全架构
查看>>
ubuntu下 验证码出不来问题 java.lang.Error: Probable fatal error:No fonts found.
查看>>
牙痛的特效治疗法
查看>>
eigrp的不等价负载均衡
查看>>
动态分区软件
查看>>
Java中用最有效率的方法算出2 乘以8 等於几?
查看>>
ASP.NET MVC路由(三)
查看>>
Oracle数据库之SQL---select之一
查看>>
曲线间平滑计算方法和一个Spline的实现
查看>>
网络优化-TCP和UDP的协作
查看>>
Android 常用动画
查看>>
IOS随记
查看>>
ASP.NET页面之间传递值的几种方式
查看>>