美文网首页
iOS中的主线程(Main Thread)与主队列(Main Q

iOS中的主线程(Main Thread)与主队列(Main Q

作者: jackli007 | 来源:发表于2018-11-12 19:08 被阅读0次

最近在深入学习GCD有关知识。GCD中有两个很重要的概念:任务队列。虽然这两个概念都已经很了解,但是对线程thread)和队列queue)的关联和区别还是很稀里糊涂。通过多方搜索,发现两个blog很好的解释了这个问题。
CM Blog的个人博客
http://blog.corneliamu.com/archives/74
该篇博客中解答了一下三个问题:

    1. 主线程和主队列到底有什么关系?
    1. 为什么通过 dispatch_get_main_queue() 就可以确保在代码在主线程执行了?
    1. 主线程可以执行非主队列里的任务吗?

我们都知道,主队列是系统为我们创建的串行队列,而且每个APP只有一个主队列,负责调度处理APP的唯一主线程的UI事件。所以在主队列的任务,即使是异步任务也只能在主线程中串行的执行。

主队列的任务一定在主线程执行,那么非主队列的任务可以在主线程里执行么?答案:当然可以。

- (void)asyncAndGlobalQueue {
    NSLog(@"begin --- %@",[NSThread currentThread]);
    //系统方法,获取全局的并行队列
    dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    for (NSInteger index = 0; index < 10 ;index ++) {
        dispatch_sync(globalQueue, ^{
            NSLog(@"index:%ld --- %@", index, [NSThread currentThread]);
        });
    }
    NSLog(@"end --- %@", [NSThread currentThread]);
}

打印结果:

2018-11-12 19:07:05.389994+0800 GCDDemo[1541:1198769] begin --- <NSThread: 0x101209580>{number = 1, name = main}
2018-11-12 19:07:05.390376+0800 GCDDemo[1541:1198769] index:0 --- <NSThread: 0x101209580>{number = 1, name = main}
2018-11-12 19:07:05.390641+0800 GCDDemo[1541:1198769] index:1 --- <NSThread: 0x101209580>{number = 1, name = main}
2018-11-12 19:07:05.390887+0800 GCDDemo[1541:1198769] index:2 --- <NSThread: 0x101209580>{number = 1, name = main}
2018-11-12 19:07:05.391374+0800 GCDDemo[1541:1198769] index:3 --- <NSThread: 0x101209580>{number = 1, name = main}
2018-11-12 19:07:05.391626+0800 GCDDemo[1541:1198769] index:4 --- <NSThread: 0x101209580>{number = 1, name = main}
2018-11-12 19:07:05.391865+0800 GCDDemo[1541:1198769] index:5 --- <NSThread: 0x101209580>{number = 1, name = main}
2018-11-12 19:07:05.392101+0800 GCDDemo[1541:1198769] index:6 --- <NSThread: 0x101209580>{number = 1, name = main}
2018-11-12 19:07:05.393473+0800 GCDDemo[1541:1198769] index:7 --- <NSThread: 0x101209580>{number = 1, name = main}
2018-11-12 19:07:05.395600+0800 GCDDemo[1541:1198769] index:8 --- <NSThread: 0x101209580>{number = 1, name = main}
2018-11-12 19:07:05.395870+0800 GCDDemo[1541:1198769] index:9 --- <NSThread: 0x101209580>{number = 1, name = main}
2018-11-12 19:07:05.396110+0800 GCDDemo[1541:1198769] end --- <NSThread: 0x101209580>{number = 1, name = main}

相关文章

  • iOS中的主线程(Main Thread)与主队列(Main Q

    最近在深入学习GCD有关知识。GCD中有两个很重要的概念:任务和队列。虽然这两个概念都已经很了解,但是对线程(th...

  • 【Flask】简单的后台异步队列

    异步任务队列 异步队列输入 异步队列获取并执行 创建线程开始执行方法并返回进程号 主函数与flask main一起...

  • 多线程:GCD

    多线程:GCD The main queue(主线程串行队列): 与主线程功能相同,提交至Main queue的任...

  • 线程

    Thread.currentThread()值是Thread[main,5,main]第一个main:当前的线程名...

  • GCD所有函数

    GCD中的队列类型 The main queue(主线程串行队列)可以通过dispatch_get_main_qu...

  • 04-多线程

    41. 多线程 主线程:执行主(main)方法的程序 JVM执行main方法,main方法会进入到栈内存,JVM会...

  • GeekBand~iOS~开发高级进阶~第三周

    多线程--NSThread main thread主线程 在一个运行的iOS应用中,处理UIKit对象的所有方法调...

  • Android多线程之AsyncTask异步任务

    前言: 我们通常将android线程分为两种,一种叫做Main Thread,除了Main Thread之外的线程...

  • JAVA内存模型与线程

    主内存与工作内存 java内存模型规定了所有的变量都存储在主内存(Main Memory)中。每条线程还有自己的工...

  • Android多线程之AsyncTask异步任务

    前言: 我们通常将android线程分为两种,一种叫做Main Thread,除了Main Thread之...

网友评论

      本文标题:iOS中的主线程(Main Thread)与主队列(Main Q

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