美文网首页
GCD使用基础 一

GCD使用基础 一

作者: 皓皓大帝 | 来源:发表于2017-08-22 18:33 被阅读5次

概念

串行队列:前一个执行完毕才会执行下一个。就像是只有一个窗口的收费站,轮流对车收费放行,后面的车只能等待前面的车通过,才能前行。(例:主队列)

串行队列

并行队列:后面的任务可以选择其他的途径执行。就像是有多个窗口的收费站,后面的车辆可以选择去其他的窗口排队通过。(例:全局队列)

并行队列

同步任务:执行完函数,需要等待返回结果,才可以继续往下执行,会阻塞当前线程。

异步任务:执行完函数,不需要等待返回结果,就可以继续往下执行,不会产生阻塞。

串行队列&同步任务

    dispatch_queue_t serialQueue = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_SERIAL);

    dispatch_sync(serialQueue, ^{
        NSLog(@"同步任务1,%@", [NSThread currentThread]);
    });
    
    dispatch_sync(serialQueue, ^{
        NSLog(@"同步任务2,%@", [NSThread currentThread]);
    });
    
    dispatch_sync(serialQueue, ^{
        NSLog(@"同步任务3,%@", [NSThread currentThread]);
    });
串行队列&同步任务

不创建新的线程,只在当前的线程中执行,并顺序执行!

串行队列&异步任务

    dispatch_queue_t serialQueue = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_SERIAL);
    dispatch_async(serialQueue, ^{
        NSLog(@"异步任务1,%@", [NSThread currentThread]);
    });
    
    dispatch_async(serialQueue, ^{
        NSLog(@"异步任务2,%@", [NSThread currentThread]);
    });
    
    dispatch_async(serialQueue, ^{
        NSLog(@"异步任务3,%@", [NSThread currentThread]);
    });
串行队列&异步任务

创建新的线程,在新的线程中执行,虽然是异步任务,仍需要按进队顺序执行。

并行队列&同步任务

    dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrentQueue", DISPATCH_QUEUE_CONCURRENT);

    dispatch_sync(concurrentQueue, ^{
        NSLog(@"同步任务1,%@", [NSThread currentThread]);
    });
    
    dispatch_sync(concurrentQueue, ^{
        NSLog(@"同步任务2,%@",[NSThread currentThread]);
    });
    
    dispatch_sync(concurrentQueue, ^{
        NSLog(@"同步任务3,%@",[NSThread currentThread]);
    });
并行队列&同步任务

不创建新的线程,在当前线程执行,虽然是并行队列,由于同步任务的阻塞性,仍是按进队顺序执行。

并行队列&异步任务

    dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrentQueue", DISPATCH_QUEUE_CONCURRENT);

    dispatch_async(concurrentQueue, ^{
        NSLog(@"异步任务1,%@", [NSThread currentThread]);
    });
    
    dispatch_async(concurrentQueue, ^{
        NSLog(@"异步任务2,%@",[NSThread currentThread]);
    });
    
    dispatch_async(concurrentQueue, ^{
        NSLog(@"异步任务3,%@",[NSThread currentThread]);
    });
并行队列&异步任务

创建新的线程执行任务,而且是并行队列,所以任务的执行相互不影响,谁先执行完毕,算谁厉害!

注释:

  • 当前线程
    上面说的当前线程指的是添加任务时所在的线程,不一定是在主线程(main)中,直接看代码!下面的异步任务1同步任务1就是在同一个子线程中执行的。
    dispatch_async(concurrentQueue, ^{
        NSLog(@"异步任务1,%@", [NSThread currentThread]);
        dispatch_async(concurrentQueue, ^{
            NSLog(@"同步任务1,%@", [NSThread currentThread]);
        });
    });

    dispatch_sync(concurrentQueue, ^{
        NSLog(@"同步任务2,%@",[NSThread currentThread]);
    });
注释1
  • 线程数(number)
    虽然异步任务会创建新的线程,但并不是有多少异步任务就会创建多少条线程,很费电的!系统会做限制的,我们也可以根据不同的网络环境对线程数量进行限制。
    上面的打印日志中,number的值不是当前存在的线程数,而是曾经创建过这么多线程,而这个任务是在这条线程执行的。线程会在其上面的任务执行完毕后销毁的,这个跟runloop就挂钩了!

上面的内容都是自己学习时的理解,也通过这种方式作为日记,欢迎大神来教育!

相关文章

  • iOS 开发之 GCD 不同场景使用

    iOS 开发之 GCD 不同场景使用 本文在iOS 开发值 GCD 基础 的基础上,继续总结了 GCD 的一些AP...

  • iOS GCD的使用

    什么是GCD了解GCD前,需要了解的基础知识GCD的使用使用注意事项 -GCD学习前铺垫-什么是GCDGCD (G...

  • iOS GCD的使用

    本文的主要内容是: 什么是GCD 了解GCD前,需要了解的基础知识 GCD的使用 使用注意事项 -GCD学习前铺垫...

  • GCD使用基础 一

    概念 串行队列:前一个执行完毕才会执行下一个。就像是只有一个窗口的收费站,轮流对车收费放行,后面的车只能等待前面的...

  • 高级iOS面试题全纪录

    iOS基础: 多线程使用,gcd跟operation区别,怎么取消正在执行的gcd任务 GCD 系列知识总结 NS...

  • 多线程系列文章

    GCD基础篇 - 同步、异步,并发、并行的理解 GCD中级篇 - dispatch_group的理解及使用 dis...

  • GCD简单使用

    基础使用 GCD的延时执行方法 dispatch_after GCD的一次性代码(只执行一次) dispatch_...

  • NSOperation

    NSOperation 是一个建立在 GCD 的基础之上、面向对象的解决方案。使用起来比 GCD 更加灵活,功能更...

  • iOS多线程

    GCD基础使用[https://blog.csdn.net/m0_37854317/article/details...

  • GCD使用基础 三

    dispatch_after dispatch_after延迟将任务提交到队列中,注意不是事先将任务添加到队列中然...

网友评论

      本文标题:GCD使用基础 一

      本文链接:https://www.haomeiwen.com/subject/ziildxtx.html