从堵塞角度:
异步:为了不堵塞当前任务为出发点----> 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");
}