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--进程/多线程/同步任务/异步任务/串行队列/并行队列(对比分析)
现在先说两个基本的概念,啥是进程,啥是线程,啥又是多线程;先把这两个总是给弄清再讲下面的 进程:正在进行的程序,我们就叫它进程. 线程:线程就是进程中的一个独立的执行路径.这句话怎么理解呢! 一个程序 ...
随机推荐
- Network-POJ3694并查集+LCA
Network Time Limit: 5000MS Memory Limit: 65536K Description A network administrator manages ...
- python学习之while语句
while循环 1.简单的while循环while True: ")#这是一个简单的while循环,当等于True时会一直打印1 2.while执行多少次后退出 coun=0while Tr ...
- 使用servlet实现用户注册功能
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- 【转】对硬盘进行分区时,GPT和MBR区别。
在Windows 8或8.1中设置新磁盘时,系统会询问你是想要使用MBR还是GPT分区.GPT是一种新的标准,并在逐渐取代MBR. GPT带来了很多新特性,但MBR仍然拥有最好的兼容性.GPT并不是W ...
- EVA资料
[史上最全EVA资料+原画+画集+设定集][共2266P=3.56GB] <ignore_js_op> <ignore_js_op> <ignore_js_op> ...
- jquery总结01-基本概念和选择器
dom元素和jquery元素的区别 dom元素支持dom元素自带的属性和方法,jquery元素支持jquery元素自带的属性和方法 dom var div = doc ...
- 《BI项目笔记》挑选产出分析Cube
数据源设置: 数据处理逻辑: --I_GBGradeID SELECT * FROM T_NPick_PkgMov WHERE I_GBGradeID NOT IN ( SELECT I_GBGrad ...
- Android Studio build dex jar
Gradle配置 Build配置文件gradle.build中添加如下task task clearJar(type: Delete) { delete 'build/outputs/mylib.ja ...
- c#中对rgb的使用
今天发现c#中没有和vb类似的函数RGB(), 后来发现可以通过Color类来实现 从R,G,B的值可以得到一个Color,如: Color c = Color.FromArgb(255,0,0); ...
- struts2学习:配置篇之namespace
把namespace单独拉出来讲一方面是因为它实际上不是一个element,而只是一个attribute,前面已经说了,它是package的一个attribute:另外一方面是因为这个属性是我接触St ...