主队列和主线程

作者: 小赢一场 | 来源:发表于2016-06-25 14:40 被阅读2767次

    队列的概念和作用:

    队列不是线程,队列是用来组织任务的,将任务加到队列中,任务会按照加入到队列中先后顺序依次执行,如果是同步队列,会在当前线程中执行,如果是异步队列,则操作系统会根据系统资源去创建新的线程去处理队列中的任务,线程的创建、维护和销毁由操作系统管理,系统会给我做很多优化

    队列的分类:

    串行队列:
    按照FIFO原则,顺序执行,先加入队列中的任务先执行,一个任务一任务的顺序执行,只有等到队列中上一个任务完成,才能执行下一个任务
    并行队列:
    任务是按照加入到队列中的顺序开始执行,但任务完成时的顺序是不确定的

    队列和线程的关系:

    在一个线程内可能有多个队列,这些队列可能是串行的或者是并行的,按照同步或者异步的方式工作
    异步的,则会开启新的线程工作
    同步的,会在当前线程内工作,不会创建新的线程
    注意:并行同步队列,不会创建新的线程而且会是顺序执行相当于串行同步队列

    主线程和主队列的关系:

    主队列是主线中的一个串行队列
    所有的和UI的操作(刷新或者点击按钮)都必须在主线程中的主队列中去执行
    否则无法更新UI
    每一个应用程序只有唯一的一个主队列用来update UI
    补充一点:如果在主线程中创建自定义队列(串行或者并行均可),在这个队列中执行同步任务,同样可以更新UI操作,主队列中可以更新UI,自定义队列也可以更新UI,但自定义队列的更新UI的前提是在主线程中执行同步任务

    1.主线程并行队列同步执行 
       任务会在主线中执行,不会创建新的线程,并且是顺序执行的

    2.主线程并行队列异步执行
     任务会异步无顺序的执行,并且创建新的多个线程

    3.主线程串行队列同步执行
     主线程中 顺序执行 不会创建新的线程

    4.主线程串行队列异步执行
       只创建一个线程 顺序执行

    5.主线程 主队列 同步执行
      会导致死锁,程序卡死 

    6.主线程主队列异步执行
      不会创建新的线程,但是却是异步的,先执行完队列中已经添加的任务,然后再执行队列中添加的 自定义任务

    demo地址

    相关文章

      网友评论

      • Miaoz0070:队列和线程到底是什么关系?为什么有的文章说的是队列管理线程,你这里是线程中有好多队列?望指教
      • 我是繁星:为什么主队列异步执行的时候不会开辟新的线程呢,虽然结果是这样,但是不是说异步有开辟新线程的能力嘛。:joy: 有点困惑
        butterflyer:专门负责调度主线程度的任务,没有办法开辟新的线程。所以,在主队列下的任务不管是异步任务还是同步任务都不会开辟线程
      • 汾酒iOSer:我点//主线程 主队列 同步 执行 的时候崩溃了,不知道什么原因。

        红色:Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)

        什么原因呢?
        六阿哥:死锁
      • wuyangLi:哥们 你里面有很多不严谨的地方。比如:
        1,你里面所说的并行都应该改成并发
        2,DISPATCH_QUEUE_SERIAL串行队列在同步执行时任务都在主线程,在异步执行时是在子线程执行
        3,DISPATCH_QUEUE_CONCURRENT并发队列是子线程,但如果并发任务里有主队列,才在主线程执行
        4,DISPATCH_QUEUE_CONCURRENT并发队列,如果同步执行全是在主线程
        xiari1991:@wuyangLi 串行队列同步执行,如果放在多个线程,是不是就能达到操作是在不同线程,但执行顺序是一定的
        wuyangLi:@gmfxch 我的第1条结论没问题,并发和并行的概念你可以去谷歌。第2结论确实有问题,应该改成DISPATCH_QUEUE_SERIAL串行队列在同步执行时任务都在当前线程,在异步执行时是在子线程执行,第3.4类似
        gmfx:@wuyangLi 博主的实验结论并没有问题,倒是你的说法存在误区。第二条:“DISPATCH_QUEUE_SERIAL串行队列在同步执行时任务都在主线程”,这个是不对的,不一定是在主线程,这个要看dispatch_sync提交任务的所在的线程。dispatch_sync(dispatch_queue_create("queue", DISPATCH_QUEUE_SERIAL), ^{
        NSLog(@"当前线程:%@",[NSThread currentThread]);
        });
        这里打印的当前线程并不一定是主线程,dispatch_sync在哪个线程中提交的,NSLog的就是哪个线程,第3,4条同样如此。

      本文标题:主队列和主线程

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