GCD-伟大的中央调度器

GCD全称是Grand Central Dispatch,可以译为“伟大的中央调度器”。它是纯C语言,提供了很多强大的函数。GCD是apple为多核的并行运算提出的解决方案。

任务与队列

任务:要执行的操作。
队列:存放任务的地方,队列在接收到任务后,队列回根据任务数与队列类型开辟合适的线程去执行任务。GCD就是担当把任务从队列中取出,放到对应线程中执行的角色。任务的取出遵循FIFO原则:先进先出,后进后出。

同步与异步

同步:只能在当前线程中执行任务,不具备开启新的线程的能力。
异步:可再新线程中执行任务,具备开启新线程的能力。

并发队列与串行队列

并发队列(Concurrent Dispatch Queue):可以开启多个线程同时执行多个任务。只有在异步函数(dispatch_async)下才有效。
串行队列(Seria Disp Queue):当一个任务执行完成,才能执行下一个任务。

不同任务加进不同队列的执行情况

①主队列是串行队列,那就只有一个主线程。

1、同步的任务加进这个线程,永远不会执行。当执行到此函数时,同步的函数要求立即执行block,而block被添加进队列的最后面,因为此线程从上往下执行任务,不可能调到线程最后取执行block,函数与线程冲突,造成程序死锁。

    // 先获得主队列 主队列是一个串行队列
    dispatch_queue_t queue = dispatch_get_main_queue();
    // 将任务加到任务中
    // 第一个参数:放队列
    // 第二个参数:要执行的任务
    dispatch_sync(queue, ^{
        NSLog(@"sync2--------%@", [NSThread currentThread]);
    });

2、异步的任务加进主队列,因为只有一个线程,顾开辟不了线程,只能加进唯一的主线程。异步的方法中block不要求立即执行。

    dispatch_queue_t queue = dispatch_get_main_queue();
    dispatch_async(queue, ^{
        NSLog(@"Asyc--------%@", [NSThread currentThread]);
    });
②串行队列:遵循FIFO,按顺序执行。

1、同步:不开启新线程,直接执行任务就行。

    // 创建串行队列
    // 第一个参数:队列的名字
    // 第二个参数:类型
    dispatch_queue_t queue = dispatch_queue_create("aaa.com", DISPATCH_QUEUE_SERIAL);
    dispatch_sync(queue, ^{
        NSLog(@"sync + serial----1----%@", [NSThread currentThread]);
    });

2、异步:开启新线程,串行执行任务

    dispatch_queue_t queue = dispatch_queue_create("aaa.com", DISPATCH_QUEUE_SERIAL);
    dispatch_async(queue, ^{
        [NSThread sleepForTimeInterval:5];
        NSLog(@"async + serial----1----%@", [NSThread currentThread]);
        for (NSInteger i = 0; i < 1000; i++) {
            NSLog(@"%ld", i);
        }
    });
③并发队列

1、同步:不开启新线程,串行执行任务。

    // 此种是程序员自己创建的并发队列
//    dispatch_queue_t queue = dispatch_queue_create("hello.com", DISPATCH_QUEUE_CONCURRENT);
    // 获得全局的并发队列
    // 第一个参数:一个优先级 默认的就行
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_sync(queue, ^{
        NSLog(@"sync + concurrent----1----%@", [NSThread currentThread]);
    });

2、异步:开启新线程,并执行任务

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(queue, ^{
        NSLog(@"async + concurrent----1----%@", [NSThread currentThread]);
    });

注意!!!

使用sync往当前串行队列(即队列的线程已经在执行任务)中添加任务,会卡住当前的队列。

你可能感兴趣的:(GCD-伟大的中央调度器)