同样通过两个方法,分别来演示并发队列与同步执行和异步执行任务的区别:
- 示例代码:
#pragma mark -- 并行队列与同步、异步的组合
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
// 同步执行
// [self concurrentSync];
// 异步执行
[self concurrentAsync];
}
#pragma mark -- 并行同步
- (void)concurrentSync{
// 同步
// 1.创建并行队列
dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrentQueue", DISPATCH_QUEUE_CONCURRENT);
// 2.创建任务
dispatch_block_t taskBlock1 = ^{
[NSThread sleepForTimeInterval:5];
NSLog(@"Task1-->%@",[NSThread currentThread]);
};
dispatch_block_t taskBlock2 = ^{
NSLog(@"Task2-->%@",[NSThread currentThread]);
};
// 同步执行
dispatch_sync(concurrentQueue, taskBlock1);
dispatch_sync(concurrentQueue, taskBlock2);
// 结论: 在当前的线程执行(同步不具备开启新线程能力),任务依次执行
}
#pragma mark -- 并行异步
- (void)concurrentAsync{
// 异步
// 1.创建并行队列
dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrentQueue", DISPATCH_QUEUE_CONCURRENT);
// 2.创建任务
dispatch_block_t taskBlock1 = ^{
[NSThread sleepForTimeInterval:5];
NSLog(@"Task1-->%@",[NSThread currentThread]);
};
dispatch_block_t taskBlock2 = ^{
NSLog(@"Task2-->%@",[NSThread currentThread]);
};
// 异步执行(每添加一个任务就开启一条线程)
dispatch_async(concurrentQueue, taskBlock1);
dispatch_async(concurrentQueue, taskBlock2);
// 结论: 开启线程执行任务(根据任务开启多条线程),任务并行处理(没有按照添加到队列中的顺序来执行)
}
@end
虽然先将task1添加到队列中,但是手动进行了延迟处理,因为并发队列和异步处理共同决定开启了多条线程,虽然task1先从队列中取出执行,但task2任务耗费时间相对较短,CPU在随机调度后,task2先被执行完毕
- 结论:
1.并行队列,异步执行
开多个线程,异步执行
每次开启多少个线程是不固定的(线程数,不由我们控制),线程数是由GCD来决定的(线程池)
2.并行队列,同步执行
不开线程,顺序执行