zoukankan      html  css  js  c++  java
  • iOS GCD的队列和线程

    1、队列分为 串行队列 和 并行队列

    2、线程分为 同步线程 和 异步线程

    GCD运行需要队列,先创建队列

    一、串行队列创建

        //串行队列的创建  参数队列名 和 NULL
        dispatch_queue_t queueA = dispatch_queue_create("queueA", NULL);
        
        //系统提供一个全局串行队列 也就是主线程
        // dispatch_get_main_queue()

    二、并行队列创建

        //GCD默认提供全局并发队列 //第一个参数表示优先级 0:默认,2:高,-1:低
        dispatch_queue_t queueB = dispatch_get_global_queue(0, 0); //DISPATCH_QUEUE_PRIORITY_DEFAULT = 0
        

    三、异步线程 + 并发队列 = 线程执行顺序是不固定的。项目中一般都是这种组合

        //GCD异步线程 + 并发队列B
        dispatch_async(queueB, ^{
            
            NSLog(@"网络请求1");
        });
        
        dispatch_async(queueB, ^{
            
            NSLog(@"网络请求2");
        });
        
        dispatch_async(queueB, ^{
            
            NSLog(@"网络请求3");
        });
    
    //打印结果
    2021-04-24 21:42:42.175828+0800 BaseDemo[7676:275823] 网络请求1
    2021-04-24 21:42:42.175830+0800 BaseDemo[7676:275827] 网络请求3
    2021-04-24 21:42:42.175867+0800 BaseDemo[7676:275819] 网络请求2

    如果要按顺序 可以加个信号量 信号量一般防止资源安全

        // 创建信号量 信号量 = 1; 只走一个线程
        dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);
        
        //等待 信号量 - 1;等待时间= DISPATCH_TIME_FOREVER = 永远
        dispatch_semaphore_wait(semaphore, 1);
        //GCD异步线程 + 并发队列B
        dispatch_async(queueB, ^{
    
            sleep(1);
            NSLog(@"网络请求1");
            //信号量加一 程序继续向下
            dispatch_semaphore_signal(semaphore);
            
        });
        
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        dispatch_async(queueB, ^{
            
            sleep(1);
            NSLog(@"网络请求2");
            dispatch_semaphore_signal(semaphore);
        });
        
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        dispatch_async(queueB, ^{
            
            sleep(1);
            NSLog(@"网络请求3");
            dispatch_semaphore_signal(semaphore);
        });
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        dispatch_async(queueB, ^{
            
           
            sleep(1);
            NSLog(@"网络请求4");
            dispatch_semaphore_signal(semaphore);
        });
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        dispatch_async(queueB, ^{
            
            sleep(1);
            NSLog(@"网络请求5");
            dispatch_semaphore_signal(semaphore);
        });
        NSLog(@"我是外面线程");
    
    //打印结果
    2021-04-24 22:03:41.112360+0800 BaseDemo[7966:295504] 网络请求1
    2021-04-24 22:03:42.114488+0800 BaseDemo[7966:295504] 网络请求2
    2021-04-24 22:03:43.117322+0800 BaseDemo[7966:295504] 网络请求3
    2021-04-24 22:03:44.118532+0800 BaseDemo[7966:295504] 网络请求4
    2021-04-24 22:03:44.119006+0800 BaseDemo[7966:295015] 我是外面线程
    2021-04-24 22:03:45.124105+0800 BaseDemo[7966:295504] 网络请求5

    有空再加

  • 相关阅读:
    Oracle存储过程格式
    Parallel并行运算实例
    唐让的领航少年
    株洲县阳光三农网
    株洲县招商网
    利用css新属性appearance优化select下拉框
    谈谈我的出差感想
    颜色表及html代码
    jquery中DOM的操作方法
    HTML DOM的nodeName,nodeValue,nodeType介绍
  • 原文地址:https://www.cnblogs.com/qq95230/p/14698440.html
Copyright © 2011-2022 走看看