iOS多线程GCD的简单使用(2)

- (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);
        });
    }
}

执行结果:

iOS多线程GCD的简单使用

全局队列+异步任务:

- (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);
        });
    }
}

执行结果:

iOS多线程GCD的简单使用

三:主队列

苹果还提供了一种队列是主队列,主队列是串行队列,但是和串行队列又有差异。主队列上的任务都应该在主线程上顺序执行,没有异步的概念。也就是说,即使是异步任务在主队列上执行,也不会开启新的线程。

主队列+异步任务:

- (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);
        });
    }
}

执行结果:

iOS多线程GCD的简单使用

可以看到,没有开启新的线程,且是顺序执行。

主队列+同步任务(会阻塞线程),代码如下:

- (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执行完,因此造成了阻塞。

在开发中,应该避免这种阻塞的情况。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/8b428460a8b57485815760ef846e0029.html