一、简介
苹果官方对GCD是这样说明的:开发者要做的只是定义想执行的任务并追加到适当的Dispatch Queue中。Dispatch Queue是执行处理的等待队列,我们可以通过dispatch_async等API,在block语法中记述想要执行的处理并将其追加到Dispatch Queue中,Dispatch Queue是按照追加的顺序 进行处理,先进先出FIFO。
用代码表示就是:
dispatch_async(queue,^{
//想执行的任务,这样执行就是在另一个新开辟的线程中
});
在执行处理时候是有两种Dispatch Queue,一种是Serial Dispatch Queue串行调度队列,这个是等待现在执行中的事件处理结束,另一种是Concurrent Dispatch Queue并发调度队列,这个是不等待现在执行中的事件处理结束。
异步、同步、并行、串行的特点
异步执行:具备开启新线程的能力,任务创建后可以先绕过,回头再执行。
同步执行:不具备开启新线程的能力,任务创建后就要执行完才能继续往下走。
并行队列:队列中的任务同时执行。
串行队列:队列中的任务要按顺序执行。
二、使用
1.异步执行➕并行队列
//1.异步执行+并行队列
- (void)asyncConcurrent{
//创建一个并行队列
dispatch_queue_t queue = dispatch_queue_create("queueName", DISPATCH_QUEUE_CONCURRENT);
NSLog(@"---start---%@",[NSThread currentThread]);
//使用异步函数封装三个任务,三个任务同时执行,不一定是按任务顺序打印 可先绕过不执行
dispatch_async(queue, ^{
NSLog(@"任务1---%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"任务2---%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"任务3---%@", [NSThread currentThread]);
});
NSLog(@"---end---%@",[NSThread currentThread]);
}
2.异步执行➕串行队列
- (void)asyncSerial{
//创建一个串行队列
dispatch_queue_t queue = dispatch_queue_create("queueName", DISPATCH_QUEUE_SERIAL);
NSLog(@"---start---%@",[NSThread currentThread]);
//使用异步函数封装三个任务 可先绕过不执行 任务必须按添加进队列的顺序挨个执行
dispatch_async(queue, ^{
NSLog(@"任务1---%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"任务2---%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"任务3---%@", [NSThread currentThread]);
});
NSLog(@"---end---%@",[NSThread currentThread]);
}
3.同步执行➕并行队列
- (void)syncConcurrent{
//创建一个并行队列
dispatch_queue_t queue = dispatch_queue_create("queueName", DISPATCH_QUEUE_CONCURRENT);
NSLog(@"---start---%@",[NSThread currentThread]);
//使用同步函数封装三个任务
dispatch_sync(queue, ^{
NSLog(@"任务1---%@", [NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"任务2---%@", [NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"任务3---%@", [NSThread currentThread]);
});
NSLog(@"---end---%@",[NSThread currentThread]);
}
4.同步执行+ 串行队列
(void)syncSerial{
//创建一个串行队列
dispatch_queue_t queue = dispatch_queue_create("queueName", DISPATCH_QUEUE_SERIAL);
NSLog(@"---start---%@", [NSThread currentThread]);
//使用异步函数封装三个任务
dispatch_sync(queue, ^{
NSLog(@"任务1---%@", [NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"任务2---%@", [NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"任务3---%@", [NSThread currentThread]);
});
NSLog(@"---end---%@", [NSThread currentThread]);
}
只要是同步执行就没法开启新的线程,所以多个任务之间也一样只能按顺序来执行。
5、异步执行+主队列
- (void)asyncMain{
//获取主队列
dispatch_queue_t queue = dispatch_get_main_queue();
NSLog(@"---start---%@", [NSThread currentThread]);
//使用异步函数封装三个任务 所有任务都可以先跳过,之后再来“按顺序”执行
dispatch_async(queue, ^{
NSLog(@"任务1---%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"任务2---%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"任务3---%@", [NSThread currentThread]);
});
NSLog(@"---end---%@", [NSThread currentThread]);
}
6.同步执行+主队列(死锁)
- (void)syncMain{
//获取主队列
dispatch_queue_t queue = dispatch_get_main_queue();
NSLog(@"---start---%@", [NSThread currentThread]);
//使用同步函数封装三个任务
dispatch_sync(queue, ^{
NSLog(@"任务1---%@", [NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"任务2---%@", [NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"任务3---%@", [NSThread currentThread]);
});
NSLog(@"---end---%@", [NSThread currentThread]);
}
原因:
主队列中的任务必须按顺序挨个执行
任务1要等主线程有空的时候(即主队列中的所有任务执行完)才能执行
主线程要执行完“打印end”的任务后才有空
“任务1”和“打印end”两个任务互相等待,造成死锁