iOS GCD多线程介绍

GCD:是纯C语言写的,是苹果公司为多核的并行运算提出的解决方案。

GCD的两个核心概念: - 任务 - 队列

将任务添加到队列中 GCD会自动将队列中的任务取出,放到对应的线程中执行 任务的取出遵循队列的FIFO原则:先进先出,后进后出 - 创建串行队列

// "WE" 为线程的名称
// DISPATCH_QUEUE_SERIAL 串行
dispatch_queue_t queue = dispatch_queue_create("WE",DISPATCH_QUEUE_SERIAL);
// 也可以这样设置 串行默认为NULL
dispatch_queue_t queue = dispatch_queue_create("WE", NULL)

-创建队列

//DISPATCH_QUEUE_CONCURRENT 并行
dispatch_queue_t queue = dispatch_queue_create("WE", DISPATCH_QUEUE_CONCURRENT);

- 异步执行

dispatch_async(queue, ^{
// 
});

- 同步执行

dispatch_sync(queue, ^{
//
});

GCD的几种用法 - 串行队列,同步执行-----不开线程,同步执行

dispatch_queue_t queue = dispatch_queue_create("WE",DISPATCH_QUEUE_SERIAL);
    for (int i = 0; i < 5; ++i) {
        // 同步执行
        dispatch_sync(queue, ^{
            NSLog(@"%d--%@",i,[NSThread currentThread]);
        });
    } 

- 串行队列,异步执行-----开一个线程,顺序执行
dispatch_queue_t queue = dispatch_queue_create("WE",DISPATCH_QUEUE_SERIAL);
    for (int i = 0; i < 5; ++i) {
        // 异步执行
        dispatch_async(queue, ^{
            NSLog(@"%d--%@",i,[NSThread currentThread]);
        });
}
- 并行队列,异步执行-----开多个线程,异步执行
    dispatch_queue_t queue = dispatch_queue_create("WE", DISPATCH_QUEUE_CONCURRENT);
    
    for (int i = 0; i < 10; ++i) {
//        // 异步执行
        dispatch_async(queue, ^{
            NSLog(@"异步>%d--%@",i,[NSThread currentThread]);
        });
    } 

- 并行队列,同步执行-----不开线程,顺序执行

    dispatch_queue_t queue = dispatch_queue_create("WE", DISPATCH_QUEUE_CONCURRENT);
    for (int i = 0; i < 10; ++i) {
        // 同步执行
        dispatch_sync(queue, ^{
            NSLog(@"同步>%d--%@",i,[NSThread currentThread]);
        });
    } 

- 主队列,异步任务-----不开线程,同步执行

    dispatch_queue_t queue = dispatch_get_main_queue();
    for (int i = 0; i < 5; ++i) {
        //        // 异步执行
        dispatch_async(queue, ^{
            NSLog(@"%d--%@",i,[NSThread currentThread]);
        });
    }

- 主队列,同步执行-----程序执行不出来(死锁) 死锁的原因,当程序执行到下面这段代码的时候

1) 主队列:如果主线程正在执行代码,就不调度任务

2) 同步执行:如果第一个任务没有执行,就继续等待第一个任务执行完成,再执行下一个任务,此时互相等待,程序无法往下执行(死锁)

- 全局队列(本质就是并发队列)

//第一个参数:iOS7和iOS8中适配此参数 可以直接传入0
//第二个参数:为将来保留使用,始终传入0
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    for (int i = 0; i < 5; ++i) {
        // 并行执行
        dispatch_async(queue, ^{
            NSLog(@"%d--%@",i,[NSThread currentThread]);
        });
}

 

原文地址:https://www.cnblogs.com/Mr-Ygs/p/4764973.html