您的位置:首页 > 其它

异步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");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息