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

    有空再加

  • 相关阅读:
    你笑的时候真的很美
    我不会倒下
    创业靠的是“脑子”,教你如何运用谋略事半功倍~
    其实我真的很在乎你
    让你克服低效率的困扰:从实质上迅速提升你生活的方法
    沈科(帮别人名字作诗)
    Secrets of the NetBeans Window System
    PropertyUtils.copyProperties的性能
    Swing Threading的限制
    SwingSet2
  • 原文地址:https://www.cnblogs.com/qq95230/p/14698440.html
Copyright © 2011-2022 走看看