同步函数
- 同步函数+主队列
//获得主函数
dispatch_queue_t queue = dispatch_get_main_queue();
//2 将任务加入到队列中
dispatch_sync(queue, ^{
NSLog(@"1-----%@",[NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"2-----%@",[NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"3-----%@",[NSThread currentThread]);
});
//注意:同步函数+主队列:没有开启新线程,串行执行任务。如果在主线程中使用的话,就会造成阻塞,不会执行队列中的内容。因为同步函数和主队列在主线程中同时执行,造成了冲突。
- 同步函数+串行队列
//1 创建串行队列
dispatch_queue_t queue = dispatch_queue_create("com.zc.queue", NULL);
//2 将任务加入队列中
dispatch_sync(queue, ^{
NSLog(@"1-------%@",[NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"2------%@",[NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"3------%@",[NSThread currentThread]);
});
//注意:同步函数+串行队列:不会开启新的线程,在当前线程执行任务。任务是串行的,执行完一个任务,再执行下一个任务。
- 同步函数+并发队列
//1 获得全局的并发队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//2 将任务加入到队列中
dispatch_sync(queue, ^{
NSLog(@"1--%@",[NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"2---%@",[NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"3---%@",[NSThread currentThread]);
});
//注意:同步函数+并发队列:不会开启新的线程,串行执行任务
异步函数
- 异步函数+主队列
//1 获得主队列
dispatch_queue_t queue = dispatch_get_main_queue();
//2 将任务加入到队列中
dispatch_async(queue, ^{
NSLog(@"1----%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"2----%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"3-----%@",[NSThread currentThread]);
});
//注意:异步函数+主队列:只在主线程中执行任务,没有开启新线程,串行执行任务
- 异步函数+串行队列
//1 创建串行队列
dispatch_queue_t queue = dispatch_queue_create("com.zc.queue", DISPATCH_QUEUE_SERIAL);
//2 将任务加入到队列中
dispatch_async(queue, ^{
NSLog(@"1------%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"2-----%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"3------%@",[NSThread currentThread]);
});
//注意:异步函数+串行队列:会开启新的线程,但是任务是串行的,执行完一个任务,再执行下一个任务
- 异步函数+并发队列
//1 创建一个并发队列
//dispatch_queue_t queue = dispatch_queue_create("com.zc.queue", DISPATCH_QUEUE_CONCURRENT);
//1 获得全局的并发队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//2 将任务加入队列
dispatch_async(queue, ^{
for (int i=0; i<5; i++) {
NSLog(@"1----%@",[NSThread currentThread]);
}
});
dispatch_async(queue, ^{
for (int i=0; i<5; i++) {
NSLog(@"2----%@",[NSThread currentThread]);
}
});
dispatch_async(queue, ^{
for (int i=0; i<5; i++) {
NSLog(@"3----%@",[NSThread currentThread]);
}
});
//注意:异步函数+并发队列:可以同时开启多条新线程,并发执行任务
总结
GCD的几种的创建方式,只有异步函数+并发队列,既开新线程又并发执行任务;异步函数+串行队列:开新
线程但串行执行任务;其他的方式都是不开新线程(意思是在主线程中)并且串行执行任务。异步函数和
同步函数的执行方式不同。异步函数先执行函数体,再执行队列中的任务;同步函数是从头到尾从一步步
执行的,即从函数体头部开始执行,遇到队列,就执行队列中的任务。执行方式的不同,也就数异步函
数+主队列可以运行,而同步函数+主队列就会造成堵塞的原因。