美文网首页
队列是否会开启子线程问题总结

队列是否会开启子线程问题总结

作者: kingzv | 来源:发表于2020-05-19 21:40 被阅读0次

今天出去面试,面试官问:“自己创建的串行队列会不会开启子线程?”,我当时回答是:“可以的,异步添加到自己创建的串行队列中的任务,会开启子线程执行。”,这本来是个很简单的问题,结果和面试官有了些争执,面试官认为串行队列中的任务是一个执行完再执行下一下,不会开启新线程,让我回去试一下,当时把我都搞懵了,甚至怀疑是自己搞错了。

所以特意回来测试了一下,以下是测试代码(在主线程执行的):

    dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrent.queue", DISPATCH_QUEUE_CONCURRENT);
    dispatch_queue_t serialQueue = dispatch_queue_create("serial.queue", DISPATCH_QUEUE_SERIAL);
    dispatch_queue_t mainQueue = dispatch_get_main_queue();
    
    dispatch_async(concurrentQueue, ^{
        NSLog(@"异步 并发队列 %@", [NSThread currentThread]);
    });
    dispatch_async(serialQueue, ^{
        NSLog(@"异步 自己创建的串行队列 %@", [NSThread currentThread]);
    });
    dispatch_async(mainQueue, ^{
        NSLog(@"异步 主队列 %@", [NSThread currentThread]);
    });
    
    dispatch_sync(concurrentQueue, ^{
        NSLog(@"同步 并发队列 %@", [NSThread currentThread]);
    });
    dispatch_sync(serialQueue, ^{
        NSLog(@"同步 自己创建的串行队列 %@", [NSThread currentThread]);
    });
//    dispatch_sync(mainQueue, ^{
//        NSLog(@"同步 主队列 %@", [NSThread currentThread]);
//    });

输出结果为:

异步 并发队列 <NSThread: 0x600002c9d700>{number = 3, name = (null)}
异步 自己创建的串行队列 <NSThread: 0x600002cab2c0>{number = 5, name = (null)}
同步 并发队列 <NSThread: 0x600002cc4080>{number = 1, name = main}
同步 自己创建的串行队列 <NSThread: 0x600002cc4080>{number = 1, name = main}
异步 主队列 <NSThread: 0x600002cc4080>{number = 1, name = main}

从结果上看是会创建子线程的,总结一下就是:

并发队列 自己创建的串行队列 主队列
异步(async) 子线程 子线程 主线程
同步(sync) 主线程 主线程 主线程
  • 同步:需要等待任务执行完成,所以是直接在当前线程执行。
  • 异步:具备开启新线程的能力,不过添加到主队列的任务,都是在主线程执行。
  • 使用sync往当前串行队列添加任务,会产生死锁崩溃,可以试一下注释掉的dispatch_sync(mainQueue,那段代码。

相关文章

  • 队列是否会开启子线程问题总结

    今天出去面试,面试官问:“自己创建的串行队列会不会开启子线程?”,我当时回答是:“可以的,异步添加到自己创建的串行...

  • GCD初理解

    队列可以同步执行也可以异步执行。是否会开启子线程只与是否创建异步执行有关。

  • iOS多线程-并发队列

    GCD 并发队列 并发队列,异步执行 问题:1.会开几条线程?会开多条线程,线程数量是由GCD来决定2.会顺序执行...

  • 06 GCD 并发队列

    03 GCD-并发队列 并发队列,异步执行 问题:1.会开几条线程?会开多条线程,线程数量是由GCD来决定2.会顺...

  • iOS GCD 常用功能

    获取主队列 异步执行 会开新线程 创建串行队列 开一个线程 顺序执行 1 和 2 创建并行队列 创建多个线程 ...

  • Android中采用线程池进行线程的管理

    当遇到耗时操作,比如网络请求,频繁更新UI界面,这时就需要开启子线程,至于为什么开启子线程,无非防止阻塞UI线程,...

  • iOS 多任务全部执行完后再执行操作

    1. 有两个加载图片的任务,全部加载完成后在进行相应操作,耗时操作不应该放在主线程,所以开启子线程加载,通过队列组...

  • iOS 子线程用runloop保活的一个方案

    在我们需要频繁地开启子线程执行操作的时候,我们可以采用开启子线程runloop的方式保活子线程,这样避免频繁创建线...

  • GCD的基本使用

    1、异步函数+并发队列(会开多条线程,任务是并发执行的) 1、1创建并发队列 dispatch_queue_t q...

  • Swift GCD 的串行队列与并行队列

    队列异步是否阻塞当前线程同步是否阻塞当前线程执行顺序串行队列否是按添加顺序并行队列否是同时执行,但会被同步阻塞 串...

网友评论

      本文标题:队列是否会开启子线程问题总结

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