• iOS 之GCD串行和并发队列的理解


    dispatch_queue_t serialQueue = dispatch_queue_create("com.lai.www", DISPATCH_QUEUE_SERIAL);
        
        dispatch_async(serialQueue, ^{
           // NSLog(@"1");
            sleep(3);
            NSLog(@"1");
        });
        dispatch_sync(serialQueue, ^{
            
            sleep(1);
            NSLog(@"2");
            
        });
        dispatch_async(serialQueue, ^{
            NSLog(@"3");
        });
        dispatch_sync(serialQueue, ^{
            sleep(5);
            NSLog(@"4");
        });
        
        dispatch_async(serialQueue, ^{
            
            NSLog(@"5");
        });

    看看上面的代码,你猜猜会输出什么东东?  反正在今天之前我会认为它输出坑定不是有序的,之前一直认为串行就是一个一个执行,好,第一个是异步,那就异步去吧,第二个同步,同步执行完,去执行第三个,然后.....  同步就执行完,然后执行下一个,异步就不知道什么时候执行完了。

    哈哈哈哈,今天我不得不对自己的想法勘称sb。太自以为是了。从中就可以看出我不能理解串行队列的本质。

    那么什么是串行队列?什么是并行队列?

    • Concurrent: tasks are dequeued in FIFO order, but run concurrently and can finish in any order.

    • Serial: tasks execute one at a time in FIFO order

    并发: 任务以FIFO从序列中移除,然后并发运行,可以按照任何顺序完成。它会自动开启多个线程同时执行任务

    串行:  任务以FIFO从序列中一个一个执行。一次只调度一个任务,队列中的任务一个接着一个地执行(一个任务执行完毕后,再执行下一个任务)而且只会开启一条线程

    为了再次证实串行队列中只有一个线程执行任务:

    dispatch_queue_t queue = dispatch_queue_create("com.lai.www", DISPATCH_QUEUE_SERIAL);
        
        for (int i = 0; i< 10;i++){
            // 10个异步
            dispatch_async(queue, ^{
                NSLog(@"%@--%d",[NSThread currentThread], i);
            });
        }
    

     

    我们可以发现thread的地址是一样的,那就证实了serial queue只有一个线程执行任务。然后我们测试一下并发队列

    dispatch_queue_t queue = dispatch_queue_create("com.lai.www", DISPATCH_QUEUE_CONCURRENT);
        
        for (int i = 0; i< 10;i++){
            // 10个异步
            dispatch_async(queue, ^{
                NSLog(@"%@--%d",[NSThread currentThread], i);
            });
        }
    

     

    由上图可以看出并发队列中是有多个线程执行任务的。

    比较上面两个程序,我们仅仅是创建了两个不同类型的queue,但是结果迥然不同,并发会开启多个线程,执行的顺序我们无法控制,至于那个线程执行那个任务由队列决定,哪个任务先完成由CPU和操作系统决定,并且并发队列中的线程是可以重复利用(线程池),这也是可以理解的,但是下面:

    dispatch_queue_t queue = dispatch_queue_create("com.lai.www", DISPATCH_QUEUE_CONCURRENT);
        
        for (int i = 0; i< 10;i++){
            // 10个异步
            dispatch_sync(queue, ^{
                NSLog(@"%@--%d",[NSThread currentThread], i);
            });
        }

    发现并发只能在异步函数下有效,name=main ,还不会创建新线程。所有的任务依次在主线程上执行。

  • 相关阅读:
    1、vsCode插件开发流程入门
    node中MySQL的安装与使用
    sublime使用插件
    Node.js基础知识梳理
    第5章-11 字典合并 (40分)
    我的考研心得-zju-se
    解决 重启tomcat上传的文件被自动删除或未重启过段时间也自动删除(deloy path)
    org.hibernate.InstantiationException: No default constructor for entity
    UE.delEditor is not a function问题原因及解决方法
    javaweb开发过程中遇到的问题
  • 原文地址:https://www.cnblogs.com/Ohero/p/4727000.html
Copyright © 2020-2023  润新知