GCD概念理解:同步异步,并行串行

GCD核心概念:

1,任务和队列。

任务:要做什么

队列:存放任务。

GCD使用步骤:

1,创建队列

2,封装任务,把任务添加到队列中。 

封装任务的函数:

同步函数:  dispatch_sync  该函数不具备开辟线程的能力,不能开辟线程。

      任务执行的方式: 同步

异步函数:dispatch_async 该函数具备开辟线程的能力,可以开辟线程。

      任务执行的方式: 异步

GCD中的队列:

1, 并发队列:任务可以同时执行

  “只要第一个任务取出来之后,不用等待执行完毕,就可以接着取第二个任务”

2,串行队列:任务必须一个接一个的执行

  “第一个任务取出来之后,必须等待该任务执行完,才可以接着取第二个任务”

 异步函数+并发队列: 会开辟多条子线程,所有的任务并发执行(开几条线程不是由任务的数量决定的,是GCD内部自动决定的)

异步函数+串行队列:会开辟一条子线程,所有的任务在该子线程中串行执行。

同步函数+并发队列:不会开辟子线程,所有的任务在当前线程中串行执行。

同步函数+串行队列:不会开辟子线程,所有的任务在当前线程中串行执行。

代码示例:

//创建串行队列

    dispatch_queue_t queue = dispatch_queue_create("com.dahuatech.lsp", DISPATCH_QUEUE_SERIAL);

//封装任务,将任务添加到队列中

    dispatch_async(queue, ^{

        NSLog(@"1---%@",[NSThread currentThread]);

    });

    dispatch_async(queue, ^{

        NSLog(@"2---%@",[NSThread currentThread]);

    });

    dispatch_async(queue, ^{

        NSLog(@"3---%@",[NSThread currentThread]);

    });

    dispatch_async(queue, ^{

        NSLog(@"4---%@",[NSThread currentThread]);

    });

    dispatch_async(queue, ^{

        NSLog(@"5---%@",[NSThread currentThread]);

    });

上面的代码只会开辟一条线程,按顺序串行执行 

2019-02-16 22:10:50.024775+0800 下载图片[5657:173638] 1---<NSThread: 0x600001c201c0>{number = 3, name = (null)}

2019-02-16 22:10:50.024912+0800 下载图片[5657:173638] 2---<NSThread: 0x600001c201c0>{number = 3, name = (null)}

2019-02-16 22:10:50.025098+0800 下载图片[5657:173638] 3---<NSThread: 0x600001c201c0>{number = 3, name = (null)}

2019-02-16 22:10:50.025219+0800 下载图片[5657:173638] 4---<NSThread: 0x600001c201c0>{number = 3, name = (null)}

2019-02-16 22:10:50.025346+0800 下载图片[5657:173638] 5---<NSThread: 0x600001c201c0>{number = 3, name = (null)}

 示例二: 

//创建并发队列

    dispatch_queue_t queue = dispatch_queue_create("com.dahuatech.lsp", DISPATCH_QUEUE_CONCURRENT);

//封装任务,将任务添加到队列中

    dispatch_async(queue, ^{

        NSLog(@"1---%@",[NSThread currentThread]);

    });

    dispatch_async(queue, ^{

        NSLog(@"2---%@",[NSThread currentThread]);

    });

    dispatch_async(queue, ^{

        NSLog(@"3---%@",[NSThread currentThread]);

    });

    dispatch_async(queue, ^{

        NSLog(@"4---%@",[NSThread currentThread]);

    });

    dispatch_async(queue, ^{

        NSLog(@"5---%@",[NSThread currentThread]);

    });

2019-02-16 22:19:59.202672+0800 下载图片[5927:185481] 4---<NSThread: 0x60000258d800>{number = 6, name = (null)}

2019-02-16 22:19:59.202704+0800 下载图片[5927:185479] 2---<NSThread: 0x6000025b3140>{number = 4, name = (null)}

2019-02-16 22:19:59.202731+0800 下载图片[5927:185478] 3---<NSThread: 0x6000025b3200>{number = 5, name = (null)}

2019-02-16 22:19:59.202752+0800 下载图片[5927:185480] 1---<NSThread: 0x6000025b2ac0>{number = 3, name = (null)}

2019-02-16 22:19:59.203265+0800 下载图片[5927:185508] 5---<NSThread: 0x6000025b3400>{number = 7, name = (null)}

 因为使用的都是异步函数dispatch_async,都有开辟线程的能力,并发队列会开辟多条线程去执行不同的任务。

dispatch_queue_t queue = dispatch_get_global_queue(0, 0);这个是全局并发队列,和创建的并发队列DISPATCH_QUEUE_CONCURRENT没有区别。

原文地址:https://www.cnblogs.com/dashengios/p/10389310.html