GCD,用同步/异步函数,创建并发/串行队列
- 队列
第一个参数:C语言字符串,标签
第二个参数:
DISPATCH_QUEUE_CONCURRENT:并发队列
DISPATCH_QUEUE_SERIAL:串行队列
dispatch_queue_t queue = dispatch_queue_create("com.520it.download", DISPATCH_QUEUE_CONCURRENT);//并发队列
dispatch_queue_t queue = dispatch_queue_create("com.520it.download", DISPATCH_QUEUE_SERIAL);//串行队列
- //获取全局并发队列(GCD默认已经提供了全局的并发队列,供整个应用使用,可以无需手动创建)
/*
第一个参数:队列的优先级:
第二个参数:永远传0
*/
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
- 使用dispatch_get_main_queue()获得主队列
dispatch_queue_t queue = dispatch_get_main_queue();
并发队列 |
手动创建的串行队列 |
主队列 | |
同步(sync) |
没有开启新线程
串行执行任务
|
没有开启新线程
串行执行任务
|
没有开启新线程
串行执行任务
|
异步(async) |
有开启新线程
并发执行任务
|
有开启新线程
串行执行任务
|
没有开启新线程
串行执行任务
|
- //同步函数+主队列:死锁
- -(void)syncMain
- {
- NSLog(@"----");
- //1.获得主队列
- dispatch_queue_t queue = dispatch_get_main_queue();
- //2.同步函数
- dispatch_sync(queue, ^{
- NSLog(@"---download1---%@",[NSThread currentThread]);
- });
- dispatch_sync(queue, ^{
- NSLog(@"---download2---%@",[NSThread currentThread]);
- });
- dispatch_sync(queue, ^{
- NSLog(@"---download3---%@",[NSThread currentThread]);
- });
- dispatch_sync(queue, ^{
- NSLog(@"---download4---%@",[NSThread currentThread]);
- });
- }
- //异步函数+主队列:不会开线程,任务串行执行
- -(void)asyncMain
- {
- //1.获得主队列
- dispatch_queue_t queue = dispatch_get_main_queue();
- //2.异步函数
- dispatch_async(queue, ^{
- NSLog(@"---download1---%@",[NSThread currentThread]);
- });
- dispatch_async(queue, ^{
- NSLog(@"---download2---%@",[NSThread currentThread]);
- });
- dispatch_async(queue, ^{
- NSLog(@"---download3---%@",[NSThread currentThread]);
- });
- dispatch_async(queue, ^{
- NSLog(@"---download4---%@",[NSThread currentThread]);
- });
- }
- //同步函数+串行队列:不会开线程,任务串行执行
- -(void)syncSerial
- {
- //创建串行队列
- /*
- 第一个参数:C语言字符串,标签
- 第二个参数:
- DISPATCH_QUEUE_CONCURRENT:并发队列
- DISPATCH_QUEUE_SERIAL:串行队列
- */
- dispatch_queue_t queue = dispatch_queue_create("com.520it.download", DISPATCH_QUEUE_SERIAL);
- dispatch_sync(queue, ^{
- NSLog(@"---download1---%@",[NSThread currentThread]);
- });
- dispatch_sync(queue, ^{
- NSLog(@"---download2---%@",[NSThread currentThread]);
- });
- dispatch_sync(queue, ^{
- NSLog(@"---download3---%@",[NSThread currentThread]);
- });
- dispatch_sync(queue, ^{
- NSLog(@"---download4---%@",[NSThread currentThread]);
- });
- }
- //同步函数+并发队列:不会开线程,任务串行执行
- -(void)syncConcurrent
- {
- dispatch_queue_t queue = dispatch_get_global_queue(, );
- NSLog(@"--syncConcurrent--start-");
- dispatch_sync(queue, ^{
- NSLog(@"---download1---%@",[NSThread currentThread]);
- });
- dispatch_sync(queue, ^{
- NSLog(@"---download2---%@",[NSThread currentThread]);
- });
- dispatch_sync(queue, ^{
- NSLog(@"---download3---%@",[NSThread currentThread]);
- });
- dispatch_sync(queue, ^{
- NSLog(@"---download4---%@",[NSThread currentThread]);
- });
- NSLog(@"--syncConcurrent--end-");
- }
- //异步函数+串行队列:会开启一条线程,任务串行执行
- -(void)asyncSerial
- {
- //创建串行队列
- /*
- 第一个参数:C语言字符串,标签
- 第二个参数:
- DISPATCH_QUEUE_CONCURRENT:并发队列
- DISPATCH_QUEUE_SERIAL:串行队列
- */
- dispatch_queue_t queue = dispatch_queue_create("com.520it.download", DISPATCH_QUEUE_SERIAL);
- dispatch_async(queue, ^{
- NSLog(@"---download1---%@",[NSThread currentThread]);
- });
- dispatch_async(queue, ^{
- NSLog(@"---download2---%@",[NSThread currentThread]);
- });
- dispatch_async(queue, ^{
- NSLog(@"---download3---%@",[NSThread currentThread]);
- });
- dispatch_async(queue, ^{
- NSLog(@"---download4---%@",[NSThread currentThread]);
- });
- }
- //异步函数+并发队列:会开启新的线程,并发执行
- -(void)asyncCONCURRENT
- {
- //创建并发队列
- /*
- 第一个参数:C语言字符串,标签
- 第二个参数:
- DISPATCH_QUEUE_CONCURRENT:并发队列
- DISPATCH_QUEUE_SERIAL:串行队列
- */
- // dispatch_queue_t queue = dispatch_queue_create("com.520it.download", DISPATCH_QUEUE_CONCURRENT);
- NSLog(@"--asyncCONCURRENT--start-");
- //获得全局并发队列
- /*
- 第一个参数:队列的优先级DISPATCH_QUEUE_PRIORITY_DEFAULT
- 第二个参数:永远传0
- */
- dispatch_queue_t queue = dispatch_get_global_queue(, );
- //异步函数
- /*
- 第一个参数:队列
- 第二个参数:block,在里面封装任务
- */
- dispatch_async(queue, ^{
- NSLog(@"---download1---%@",[NSThread currentThread]);
- });
- dispatch_async(queue, ^{
- NSLog(@"---download2---%@",[NSThread currentThread]);
- });
- dispatch_async(queue, ^{
- NSLog(@"---download3---%@",[NSThread currentThread]);
- });
- dispatch_async(queue, ^{
- NSLog(@"---download4---%@",[NSThread currentThread]);
- });
- NSLog(@"--asyncCONCURRENT--end-");
- }
示例
GCD,用同步/异步函数,创建并发/串行队列的更多相关文章
- IOS多线程知识总结/队列概念/GCD/主队列/并行队列/全局队列/主队列/串行队列/同步任务/异步任务区别(附代码)
进程:正在进行中的程序被称为进程,负责程序运行的内存分配;每一个进程都有自己独立的虚拟内存空间 线程:线程是进程中一个独立的执行路径(控制单元);一个进程中至少包含一条线程,即主线程 队列 dispa ...
- ios多线程操作(五)—— GCD串行队列与并发队列
GCD的队列能够分为2大类型,分别为串行队列和并发队列 串行队列(Serial Dispatch Queue): 一次仅仅调度一个任务,队列中的任务一个接着一个地运行( ...
- OC 线程操作 - GCD使用 -同步函数,异步函数,串行队列,并发队列
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ // GCD 开几条线程并不是我们 ...
- GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例
转:http://www.tuicool.com/articles/NVVnMn (1)GCD实现的同步异步.串行并行. ——同步sync应用场景:用户登录,利用阻塞 ——串行异步应用场景:下载等耗时 ...
- 【iOS开发-91】GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例
(1)GCD实现的同步异步.串行并行. --同步sync应用场景:用户登录,利用堵塞 --串行异步应用场景:下载等耗时间的任务 /** * 由于是异步.所以开通了子线程.可是由于是串行队列,所以仅仅须 ...
- iOS:对GCD中 同步、异步、并行、串行的见解
1.GCD-同步执行多线程时 GCD中不管向什么类型的队列加同步任务,实际上都会加到当前线程中(一般为主线程). 2.GCD-异步执行多线程时 GCD中不管向什么类 ...
- iOS GCD, 同步,异步,串行队列,并行队列,dispatch_group
同步,指代码在同一个线程运行 异步,代码在另一个线程运行 串行队列,提交到该队列的block会顺序执行 并行队列,提交到该队列的block会并发执行 如果想等某一队列中所有block都执行完了在执行一 ...
- iOS:转载:同步、异步、并行、串行的详解
理解 iOS 开发中 GCD 相关的同步(synchronization)\ 异步(asynchronization),串行(serial)\ 并行(concurrency)概念 2014年11月21 ...
- ios--进程/多线程/同步任务/异步任务/串行队列/并行队列(对比分析)
现在先说两个基本的概念,啥是进程,啥是线程,啥又是多线程;先把这两个总是给弄清再讲下面的 进程:正在进行的程序,我们就叫它进程. 线程:线程就是进程中的一个独立的执行路径.这句话怎么理解呢! 一个程序 ...
随机推荐
- JAVA基础知识之JDBC——使用ResultSetMetaData分析结果集
通过ResultSetMetaData可以对ResultSet进行分析,获取ResultSet里包含了哪些数据列,以及每个列的数据类型. ResultSet中包含了一个getMetaData()方法, ...
- WP8没有开发者账号升级GDR3预览版的方法
很多希望尝鲜WP8 GDR3的朋友一样希望提前体验GDR3的效果,但苦于没有开发者账号而不得其门!今天为大家带来普通账号升级GDR3的方法! 工具/原料 WP8智能手机 可用wifi热点 方法/步骤 ...
- build.xml配置编译打包过程(转)
工程目录如下,使用eclipse中的ant对此工程进行编译打包: MonServer | --------src | |--------com | |--- ...
- myeclipse maven pom.xml 配置错误
http://www.oschina.net/question/2265006_219341#tags_nav maven pom.xml 配置文件错误 腾讯云消息队列CMQ架构解析> ...
- 使用mvn插件执行工程单元测试OOM的解决办法
在执行mvn test时,maven会启动一个fork进程来运行所有的单元测试类,所以我需要设置的是这个fork进程的jvm参数. 不过最终还是让我找到了http://maven.apache.org ...
- SPSS数据分析——t检验
SPSS中t检验全都集中在分析—比较均值菜单中.关于t检验再简单说一下,我们知道一个统计结果需要表达三部分内容,即集中性.变异性.显著性. 集中性的表现指标是均值变异的的表现指标是方差.标准差或标准误 ...
- 通过一行代码学习javascript
[].forEach.call($$("*"), function (a){ a.style.outline = "1px solid #"+(~~(Math. ...
- SSH原理与运用
SSH是每一台Linux电脑的标准配置. 随着Linux设备从电脑逐渐扩展到手机.外设和家用电器,SSH的使用范围也越来越广.不仅程序员离不开它,很多普通用户也每天使用. SSH具备多种功能,可以用于 ...
- C#窗体 LISTVIEW
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- css3制作惊艳hover切换效果
css3制作经验hover切换效果 <!DOCTYPE html><html> <head> <meta charset="UTF-8" ...