iOS开发之多线程— GCD <四>

一、简介

苹果官方对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并发调度队列,这个是不等待现在执行中的事件处理结束。

异步、同步、并行、串行的特点
异步执行:具备开启新线程的能力,任务创建后可以先绕过,回头再执行。
同步执行:不具备开启新线程的能力,任务创建后就要执行完才能继续往下走。
并行队列:队列中的任务同时执行。
串行队列:队列中的任务要按顺序执行。

iOS开发之多线程— GCD <四>_第1张图片
组合特点

二、使用

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]);
}
iOS开发之多线程— GCD <四>_第2张图片
打印结果

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]);
}
iOS开发之多线程— GCD <四>_第3张图片
打印结果

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]);
}
iOS开发之多线程— GCD <四>_第4张图片
打印结果

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

只要是同步执行就没法开启新的线程,所以多个任务之间也一样只能按顺序来执行。


iOS开发之多线程— GCD <四>_第5张图片
打印结果

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]);
}
iOS开发之多线程— GCD <四>_第6张图片
打印结果

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”两个任务互相等待,造成死锁

你可能感兴趣的:(iOS开发之多线程— GCD <四>)