ios多线程操作(五)—— GCD串行队列与并发队列
来源:互联网 发布:剑三花太捏脸数据 编辑:程序博客网 时间:2024/06/05 07:57
GCD的队列可以分为2大类型,分别为串行队列和并发队列
串行队列(Serial Dispatch Queue):
一次只调度一个任务,队列中的任务一个接着一个地执行(一个任务执行完毕后,再执行下一个任务)
创建一个队列
dispatch_queue_t q = dispatch_queue_create(const char *label, dispatch_queue_attr_t attr)
参数:
const char *label:队列的名称
dispatch_queue_attr_t attr:队列的属性,属性有两个,分别为:
DISPATCH_QUEUE_SERIAL(NULL) 串行队列
DISPATCH_QUEUE_CONCURRENT 并发队列
队列属性为宏,其中串行队列的宏值为NULL,所以创建一个串行队列可以用如下代码
- dispatch_queue_t q = dispatch_queue_create(“chuanXing", NULL);
一个串行的异步任务演示如下
- for (int i = 0; i < 10; ++i) {
- // 10 个异步
- dispatch_async(q, ^{
- NSLog(@“%@ - %d", [NSThread currentThread],i);
- });
- }
- NSLog(@"come here - %@“, [NSThread currentThread]);
执行结果如下
主线程执行时间并不确定,但将10个异步任务添加的串行队列中,无论如何都会依次一个一个执行,而且只会开启一条线程
如果将任务改为同步任务,那么运行结果可想而知(同步任务的特性)
并发队列:
并发队列可以让多个认为女巫并发(同时)执行,它会自动开启多个线程同时执行任务,并发功能只有在异步函数下才会有效,例如有如下代码,并行队列下执行同步任务:
- // 1. 队列
- dispatch_queue_t q = dispatch_queue_create("bingXing", DISPATCH_QUEUE_CONCURRENT);
- // 2. 同步执行
- for (int i = 0; i < 10; ++i) {
- dispatch_sync(q, ^{
- NSLog(@"%@ %d", [NSThread currentThread], i);
- });
- }
- NSLog(@"come here - %@",[NSThread currentThread]);
结果如下
并发队列下执行同步函数不会创建新线程,所有任务依次在主线程上执行。
再看看并发队列下执行异步函数
- // 1. 队列
- dispatch_queue_t q = dispatch_queue_create("itheima", DISPATCH_QUEUE_CONCURRENT);
- // 2. 同步执行
- for (int i = 0; i < 10; ++i) {
- dispatch_async(q, ^{
- NSLog(@"%@ %d", [NSThread currentThread], i);
- });
- }
- NSLog(@"come here - %@",[NSThread currentThread]);
运行结果如下:
由此可知并行队列下地异步函数会开启N条子线程,且执行任务的顺序我们无法控制,至于是哪条线程执行任务由队列决定,哪个任务先完成由CPU决定。结果中number = 4和number = 2的子线程执行了多次任务,那是因为这两条线程执行完任务就会被线程池回收,队列再从线程池中去线程执行任务,这时就会线程重复利用,如果没有线程则会重新创建。
0 0
- ios多线程操作(五)—— GCD串行队列与并发队列
- ios多线程操作(五)—— GCD串行队列与并发队列
- iOS-多线程编程学习之GCD——串行队列和并发队列(五)
- GCD实践——串行队列/并发队列与iOS多线程详解
- GCD之串行队列与并发队列
- 多线程——GCD(串行队列)
- GCD 多线程——串行队列
- 多线程——GCD(串行队列)
- ios多线程操作(六)—— GCD全局队列与主队列
- ios多线程操作(六)—— GCD全局队列与主队列
- ios多线程操作(六)—— GCD全局队列与主队列
- GCD编程-串行队列与并发队列
- GCD串行并发队列扫盲
- GCD串行并发队列扫盲
- GCD串行并发队列扫盲
- GCD串行并发队列扫盲
- GCD串行并发队列扫盲
- iOS 之GCD串行和并发队列的理解
- ios多线程操作(四)—— GCD核心概念
- Light OJ 1420 - Subsequences forming Strings (DP)
- 远程推送详解
- AIDL
- cocos2dx+lua注册事件函数详解
- ios多线程操作(五)—— GCD串行队列与并发队列
- 百度地图之初步使用实践
- Code Forces 644A Parliament of Berland
- Linux的lshw命令
- ios多线程操作(六)—— GCD全局队列与主队列
- Hibernate环境配置
- Android日历控件,还未实现点击日期改变背景色但可获取日期
- Code Forces 645A Amity Assessment
- Android中自定义checkbox样式