一. 队列的创建方法
可以使用dispatch_queue_create来创建对象,需要传入两个参数,第一个参数表示队列的唯一标识符,用于DEBUG,可为空;第二个参数用来识别是串行队列还是并发队列。DISPATCH_QUEUE_SERIAL表示串行队列,DISPATCH_QUEUE_CONCURRENT表示并发队列。
// 串行队列的创建方法
dispatch_queue_t queue= dispatch_queue_create("test.queue", DISPATCH_QUEUE_SERIAL);
// 并发队列的创建方法
dispatch_queue_t queue= dispatch_queue_create("test.queue", DISPATCH_QUEUE_CONCURRENT);
二. 任务的创建方法
// 同步执行任务创建方法
dispatch_sync(queue, ^{
NSLog(@"%@",[NSThread currentThread]); // 这里放任务代码});
// 异步执行任务创建方法
dispatch_async(queue, ^{
NSLog(@"%@",[NSThread currentThread]); // 这里放任务代码});
虽然使用GCD只需两步,但是既然我们有两种队列,两种任务执行方式,那么我们就有了四种不同的组合方式。这四种不同的组合方式是
- 并发队列 + 同步执行
- 并发队列 + 异步执行
- 串行队列 + 同步执行
- 串行队列 + 异步执行
实际上,我们还有一种特殊队列是主队列,那样就有六种不同的组合方式了。
- 主队列 + 同步执行
- 主队列 + 异步执行
那么这几种不同组合方式各有什么区别呢,这里为了方便,先上结果,再来讲解。为图省事,直接查看表格结果,然后可以跳过 4. GCD的基本使用 了。
三. GCD的基本使用
先来讲讲并发队列的两种使用方法。
1. 并发队列 + 同步执行
不会开启新线程,执行完一个任务,再执行下一个任务
- (void) syncConcurrent{
NSLog(@"syncConcurrent---begin");
dispatch_queue_t queue= dispatch_queue_create("test.queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_sync(queue, ^{
for (int i = 0; i < 2; ++i) {
NSLog(@"1------%@",[NSThread currentThread]);
}
});
dispatch_sync(queue, ^{
for (int i = 0; i < 2; ++i) {
NSLog(@"2------%@",[NSThread currentThread]);
}
});
dispatch_sync(queue, ^{
for (int i = 0; i < 2; ++i) {
NSLog(@"3------%@",[NSThread currentThread]);
}
});
NSLog(@"syncConcurrent---end");
}
- 并发队列 + 同步执行,所有任务都是在主线程中执行的。由于只有一个线程,所以任务只能一个一个执行。同时任务是添加到队列中马上执行的。
2.并发队列 + 异步执行
可同时开启多线程,任务交替执行
- (void) asyncConcurrent{
NSLog(@"asyncConcurrent---begin");
dispatch_queue_t queue= dispatch_queue_create("test.queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
for (int i = 0; i < 2; ++i) {
NSLog(@"1------%@",[NSThread currentThread]);
}
});
dispatch_async(queue, ^{
for (int i = 0; i < 2; ++i) {
NSLog(@"2------%@",[NSThread currentThread]);
}
});
dispatch_async(queue, ^{
for (int i = 0; i < 2; ++i) {
NSLog(@"3------%@",[NSThread currentThread]);
}
});
NSLog(@"asyncConcurrent---end");
}
- 并发队列 + 异步执行,除了主线程,会开启了多个个线程,并且任务是交替着同时执行的。
- 另一方面所有任务是在打印的syncConcurrent---begin和syncConcurrent---end之后才开始执行的。任务不是马上执行,而是将所有任务添加到队列之后才开始异步执行。
3.串行队列 + 同步执行
- 不会开启新线程,在当前线程执行任务。任务是串行的,执行完一个任务,再执行下一个任务
- 串行队列 + 同步执行,所有任务都是在主线程中执行的,并没有开启新的线程。而且由于串行队列,所以按顺序一个一个执行。所有任务是添加到队列中马上执行的。
4. 串行队列 + 异步执行
- 会开启新线程,但是因为任务是串行的,执行完一个任务,再执行下一个任务
- 串行队列 + 异步执行,开启了一条新线程,但是任务还是串行,所以任务是一个一个执行。
- 所有任务不是马上执行,而是将所有任务添加到队列之后才开始同步执行。
网友评论