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

 

有空再加

 

posted @ 2021-04-24 22:26  wq95230  阅读(197)  评论(0编辑  收藏  举报