异步VS同步、串行VS并行
2016-03-03 18:48
197 查看
从堵塞角度:
异步:为了不堵塞当前任务为出发点----> async
同步:需要堵塞当前任务 --->sync
从效率角度:
串行:单个线程中执行 ---> DISPATCH_QUEUE_SERIAL
并行:多个线程同时执行,提高效率 ---> DISPATCH_QUEUE_CONCURRENT
/**
* 异步、串行队列
* 顺序执行
*/
-(void)gcdDemo1{
dispatch_queue_t q1=dispatch_queue_create("com.hellocation.gcdDemo", DISPATCH_QUEUE_SERIAL);
for (int i=0; i<10; i++) {
dispatch_async(q1, ^{
NSLog(@"gcdDemo1--i=%d %@",i,[NSThread currentThread]);
});
}
NSLog(@"main Queue");
}
/**
* 异步、并行队列
* 无序,执行效率高,消耗资源大
*/
-(void)gcdDemo2{
dispatch_queue_t q2=dispatch_queue_create("com.hellocation.gcdDemo", DISPATCH_QUEUE_CONCURRENT);
for (int i=0; i<10; i++) {
dispatch_async(q2, ^{
NSLog(@"gcdDemo2--i=%d %@",i,[NSThread currentThread]);
});
}
NSLog(@"main Queue");
}
/**
* 同步、都在主线程中执行
* 串行、并行 无区别
*/
-(void)gcdDemo3{
dispatch_queue_t q1=dispatch_queue_create("com.hellocation.gcdDemo", DISPATCH_QUEUE_CONCURRENT);
for (int i=0; i<10; i++) {
dispatch_sync(q1, ^{
NSLog(@"gcdDemo3--i=%d %@",i,[NSThread currentThread]);
});
}
NSLog(@"main Queue");
}
/**
* 全局队列和并行队列类似
*/
-(void)gcdDemo5{
dispatch_queue_t q=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
for (int i=0; i<10; i++) {
dispatch_sync(q, ^{
sleep(1.0);
NSLog(@"gcdDemo5--i=%d %@",i,[NSThread currentThread]);
});
}
for (int i=0; i<10; i++) {
dispatch_async(q, ^{
sleep(1.0);
NSLog(@"gcdDemo5--i=%d %@",i,[NSThread currentThread]);
});
}
NSLog(@"main Queue");
}
/**
* 若对主线程做同步操作,因主线程一直在运行,产生等待锁
*/
-(void)gcdDemo6{
dispatch_queue_t q=dispatch_get_main_queue();
#if 0
for (int i=0; i<10; i++) {
dispatch_sync(q, ^{
NSLog(@"%@",[NSThread currentThread]);
});
}
#else
for (int i=0; i<10; i++) {
dispatch_async(q, ^{
sleep(1.0);
NSLog(@"gcdDemo6--i=%d %@",i,[NSThread currentThread]);
});
}
#endif
NSLog(@"main Queue");
}
异步:为了不堵塞当前任务为出发点----> async
同步:需要堵塞当前任务 --->sync
从效率角度:
串行:单个线程中执行 ---> DISPATCH_QUEUE_SERIAL
并行:多个线程同时执行,提高效率 ---> DISPATCH_QUEUE_CONCURRENT
/**
* 异步、串行队列
* 顺序执行
*/
-(void)gcdDemo1{
dispatch_queue_t q1=dispatch_queue_create("com.hellocation.gcdDemo", DISPATCH_QUEUE_SERIAL);
for (int i=0; i<10; i++) {
dispatch_async(q1, ^{
NSLog(@"gcdDemo1--i=%d %@",i,[NSThread currentThread]);
});
}
NSLog(@"main Queue");
}
/**
* 异步、并行队列
* 无序,执行效率高,消耗资源大
*/
-(void)gcdDemo2{
dispatch_queue_t q2=dispatch_queue_create("com.hellocation.gcdDemo", DISPATCH_QUEUE_CONCURRENT);
for (int i=0; i<10; i++) {
dispatch_async(q2, ^{
NSLog(@"gcdDemo2--i=%d %@",i,[NSThread currentThread]);
});
}
NSLog(@"main Queue");
}
/**
* 同步、都在主线程中执行
* 串行、并行 无区别
*/
-(void)gcdDemo3{
dispatch_queue_t q1=dispatch_queue_create("com.hellocation.gcdDemo", DISPATCH_QUEUE_CONCURRENT);
for (int i=0; i<10; i++) {
dispatch_sync(q1, ^{
NSLog(@"gcdDemo3--i=%d %@",i,[NSThread currentThread]);
});
}
NSLog(@"main Queue");
}
/**
* 全局队列和并行队列类似
*/
-(void)gcdDemo5{
dispatch_queue_t q=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
for (int i=0; i<10; i++) {
dispatch_sync(q, ^{
sleep(1.0);
NSLog(@"gcdDemo5--i=%d %@",i,[NSThread currentThread]);
});
}
for (int i=0; i<10; i++) {
dispatch_async(q, ^{
sleep(1.0);
NSLog(@"gcdDemo5--i=%d %@",i,[NSThread currentThread]);
});
}
NSLog(@"main Queue");
}
/**
* 若对主线程做同步操作,因主线程一直在运行,产生等待锁
*/
-(void)gcdDemo6{
dispatch_queue_t q=dispatch_get_main_queue();
#if 0
for (int i=0; i<10; i++) {
dispatch_sync(q, ^{
NSLog(@"%@",[NSThread currentThread]);
});
}
#else
for (int i=0; i<10; i++) {
dispatch_async(q, ^{
sleep(1.0);
NSLog(@"gcdDemo6--i=%d %@",i,[NSThread currentThread]);
});
}
#endif
NSLog(@"main Queue");
}
相关文章推荐
- MyBatis快速入门
- Android Init Language
- java回顾之错误处理机制
- leetcode 240. Search a 2D Matrix II
- Android Cordova 插件开发之创建项目
- canvas 手写毛笔字效果
- mybatis调用orcale存储过程-传入多个参数返回单个字符
- 2016.3.3 软件开发基础
- iOS之九宫格设计(纯代码)
- UIWebView 的属性、方法的具体使用和详解 与JS的交互
- Android Cordova 插件开发之Cordova安装
- Android 异步网络请求导致的程序崩溃
- 算法代码实现之二分法查找,Java实现
- 蓝桥杯历届-古堡算式
- 39.递推练习: 菲波那契数列(2)
- 39.递推练习: 菲波那契数列(2)
- 39.递推练习: 菲波那契数列(2)
- 39.递推练习: 菲波那契数列(2)
- 39.递推练习: 菲波那契数列(2)
- 又一个有趣的mysql死锁测试与源码分析