- (void)gcdDemo3
{
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//全局队列+同步任务
for (int i = 0; i < 10; ++i){
//同步任务
dispatch_sync(queue, ^{
NSLog(@"%@ %d",[NSThread currentThread],i);
});
}
}
执行结果:
全局队列+异步任务:
- (void)gcdDemo3
{
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//全局队列+异步任务
for(int i = 0; i < 10; ++i){
dispatch_async(queue, ^{
NSLog(@"%@ %d",[NSThread currentThread],i);
});
}
}
执行结果:
三:主队列
苹果还提供了一种队列是主队列,主队列是串行队列,但是和串行队列又有差异。主队列上的任务都应该在主线程上顺序执行,没有异步的概念。也就是说,即使是异步任务在主队列上执行,也不会开启新的线程。
主队列+异步任务:
- (void)gcdDemo4
{
dispatch_queue_t queue = dispatch_get_main_queue();
//主队列+异步任务
for(int i = 0; i < 10; ++i){
dispatch_async(queue,^{
NSLog(@"%@ %d",[NSThread currentThread],i);
});
}
}
执行结果:
可以看到,没有开启新的线程,且是顺序执行。
主队列+同步任务(会阻塞线程),代码如下:
- (void)gcdDemo4
{
dispatch_queue_t queue = dispatch_get_main_queue();
//主队列+同步任务,会阻塞
for(int i = 0; i < 10; ++i){
dispatch_sync(queue, ^{
NSLog(@"%@ %d",[NSThread currentThread],i);
});
}
}
阻塞原因:
主队列中本身是有一个任务A的(主任务),且该任务A还没有执行完。在执行任务A的过程中,又插入了新的同步任务B。我们知道,串行队列中,必须先执行完一个任务后,才能继续执行另一个任务。此时的情况时:
若想继续执行任务A,需要先把任务B执行完,若想继续执行任务B,需要先把任务A执行完,因此造成了阻塞。
在开发中,应该避免这种阻塞的情况。