iOS 之GCD串行和并发队列的理解
dispatch_queue_t serialQueue = dispatch_queue_create("com.lai.www", DISPATCH_QUEUE_SERIAL);
dispatch_async(serialQueue, ^{
// NSLog(@"");
sleep();
NSLog(@"");
});
dispatch_sync(serialQueue, ^{
sleep();
NSLog(@"");
});
dispatch_async(serialQueue, ^{
NSLog(@"");
});
dispatch_sync(serialQueue, ^{
sleep();
NSLog(@"");
});
dispatch_async(serialQueue, ^{
NSLog(@"");
});
看看上面的代码,你猜猜会输出什么东东? 反正在今天之前我会认为它输出坑定不是有序的,之前一直认为串行就是一个一个执行,好,第一个是异步,那就异步去吧,第二个同步,同步执行完,去执行第三个,然后..... 同步就执行完,然后执行下一个,异步就不知道什么时候执行完了。
哈哈哈哈,今天我不得不对自己的想法勘称sb。太自以为是了。从中就可以看出我不能理解串行队列的本质。
那么什么是串行队列?什么是并行队列?
Concurrent: tasks are dequeued in FIFO order, but run concurrently and can finish in any order.
Serial: tasks execute one at a time in FIFO order
并发: 任务以FIFO从序列中移除,然后并发运行,可以按照任何顺序完成。它会自动开启多个线程同时执行任务
串行: 任务以FIFO从序列中一个一个执行。一次只调度一个任务,队列中的任务一个接着一个地执行(一个任务执行完毕后,再执行下一个任务)而且只会开启一条线程
为了再次证实串行队列中只有一个线程执行任务:
dispatch_queue_t queue = dispatch_queue_create("com.lai.www", DISPATCH_QUEUE_SERIAL);
for (int i = 0; i< 10;i++){
// 10个异步
dispatch_async(queue, ^{
NSLog(@"%@--%d",[NSThread currentThread], i);
});
}

我们可以发现thread的地址是一样的,那就证实了serial queue只有一个线程执行任务。然后我们测试一下并发队列
dispatch_queue_t queue = dispatch_queue_create("com.lai.www", DISPATCH_QUEUE_CONCURRENT);
for (int i = 0; i< 10;i++){
// 10个异步
dispatch_async(queue, ^{
NSLog(@"%@--%d",[NSThread currentThread], i);
});
}

由上图可以看出并发队列中是有多个线程执行任务的。
比较上面两个程序,我们仅仅是创建了两个不同类型的queue,但是结果迥然不同,并发会开启多个线程,执行的顺序我们无法控制,至于那个线程执行那个任务由队列决定,哪个任务先完成由CPU和操作系统决定,并且并发队列中的线程是可以重复利用(线程池),这也是可以理解的,但是下面:
dispatch_queue_t queue = dispatch_queue_create("com.lai.www", DISPATCH_QUEUE_CONCURRENT);
for (int i = ; i< ;i++){
// 10个异步
dispatch_sync(queue, ^{
NSLog(@"%@--%d",[NSThread currentThread], i);
});
}

发现并发只能在异步函数下有效,name=main ,还不会创建新线程。所有的任务依次在主线程上执行。
iOS 之GCD串行和并发队列的理解的更多相关文章
- GCD死锁,及同步、异步、串行和并行队列组合情形
一.概述 1)队列用来存储代码任务,线程用来运行代码任务: 2)main()函数作为程序入口,整个程序默认运行在主线程中,程序代码任务默认存放在主队列中: 3)以下所谓阻塞线程是针对主线程而言(子 ...
- iOS多线程GCD简介(一)
之前讲过多线程之NSOperation,今天来讲讲代码更加简洁和高效的GCD.下面说的内容都是基于iOS6以后和ARC下. Grand Central Dispatch (GCD)简介 Grand C ...
- ios多线程操作(五)—— GCD串行队列与并发队列
GCD的队列能够分为2大类型,分别为串行队列和并发队列 串行队列(Serial Dispatch Queue): 一次仅仅调度一个任务,队列中的任务一个接着一个地运行( ...
- IOS多线程知识总结/队列概念/GCD/主队列/并行队列/全局队列/主队列/串行队列/同步任务/异步任务区别(附代码)
进程:正在进行中的程序被称为进程,负责程序运行的内存分配;每一个进程都有自己独立的虚拟内存空间 线程:线程是进程中一个独立的执行路径(控制单元);一个进程中至少包含一条线程,即主线程 队列 dispa ...
- IOS多线程知识总结/队列概念/GCD/串行/并行/同步/异步
进程:正在进行中的程序被称为进程,负责程序运行的内存分配;每一个进程都有自己独立的虚拟内存空间: 线程:线程是进程中一个独立的执行路径(控制单元);一个进程中至少包含一条线程,即主线程. 队列:dis ...
- OC 线程操作 - GCD使用 -同步函数,异步函数,串行队列,并发队列
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ // GCD 开几条线程并不是我们 ...
- GCD编程-串行队列与并发队列
接着上面的GCD封装,以下进行列子验证 1.导入GCD.h 2.创一个串行队列: - (void)serailQueue{ //创建出队列 GCDQueue *queue = [[GCDQueue ...
- iOS 关于GCD中的队列
GCD中队列分类及获得方式 1.串行队列 dispatch_queue_t queue = dispatch_queue_create("队列名", DISPATCH_QUEUE ...
- iOS多线程——GCD与NSOperation总结
很长时间以来,我个人(可能还有很多同学),对多线程编程都存在一些误解.一个很明显的表现是,很多人有这样的看法: 新开一个线程,能提高速度,避免阻塞主线程 毕竟多线程嘛,几个线程一起跑任务,速度快,还不 ...
随机推荐
- 《MySQL必知必会》[01] 基本查询
<MySQL必知必会>(点击查看详情) 1.写在前面的话 这本书是一本MySQL的经典入门书籍,小小的一本,也受到众多网友推荐.之前自己学习的时候是啃的清华大学出版社的计算机系列教材< ...
- 举例让抽象问题具体化:包含min函数的栈
定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数.在该栈中,调用min.push及pop的时间复杂度都是O(1). import java.util.Stack; public c ...
- JavaScript中的與和或的規則
與(&&)的規則是: 第一項的Boolean值為false,則返回第一項的值 第一項的Boolean值為true,則返回第二項的值 簡記:一假返一,一真返二 與:一假為假,全真為真 或 ...
- angular-bootstrap ui-date组件问题总结
使用angular框架的时候,之前用的时间控件是引入My97DatePicker组件实现的,但是因为 1.My97DatePicker样式不太好看以及偶尔会出现底部被遮盖的情况.点击不可编辑input ...
- javascript DOM事件总结
1 <html> 2 <title>事件</title> 3 <meta charset="utf-8"/> 4 <body& ...
- 关于Vue问题记录
第一次安装Vue时,npm run dev报错处理 1.如果是报错:提示说没找到test这个文件夹 参考资料:https://segmentfault.com/q/1010000010893904 就 ...
- Deep learning:一(基础知识_1)
本文纯转载: 主要是想系统的跟tornadomeet的顺序走一遍deeplearning; 前言: 最近打算稍微系统的学习下deep learing的一些理论知识,打算采用Andrew Ng的网页教程 ...
- nginx配置文件作用介绍
######Nginx配置文件nginx.conf中文详解##### #定义Nginx运行的用户和用户组 user www www; #nginx进程数,建议设置为等于CPU总核心数. worker_ ...
- 技术领导(Technical Leader)画像
程序员都讨厌被管理,而乐于被领导.管理的角色由PM(project manager)扮演,具体来说,PM负责提需求.改改改.大多数情况,PM是不懂技术的,这也是程序员觉得PM难以沟通的原因.而后者由技 ...
- 深入理解C# 静态类与非静态类、静态成员的区别 [转载]
静态类 静态类与非静态类的重要区别在于静态类不能实例化,也就是说,不能使用 new 关键字创建静态类类型的变量.在声明一个类时使用static关键字,具有两个方面的意义:首先,它防止程序员写代码来实例 ...