• 线程依赖


    /**
     假设有A、B、C三个操作,要求:
     1. 3个操作都异步执行
     2. 操作C依赖于操作B
     3. 操作B依赖于操作A
     */
    - (void)dependency{
        //创建一个队列
        NSOperationQueue *queue = [[NSOperationQueue alloc]init];
        queue.maxConcurrentOperationCount = 3; //可开辟线程的最大数量
        
        //创建三个任务
        NSBlockOperation *operationA = [NSBlockOperation blockOperationWithBlock:^{
            NSLog(@"A任务当前线程为:%@", [NSThread currentThread]);
        }];
        NSBlockOperation *operationB = [NSBlockOperation blockOperationWithBlock:^{
            NSLog(@"B任务当前线程为:%@", [NSThread currentThread]);
        }];
        NSBlockOperation *operationC = [NSBlockOperation blockOperationWithBlock:^{
            NSLog(@"C任务当前线程为:%@", [NSThread currentThread]);
        }];
        
        //设置任务相互依赖
        [operationB addDependency:operationA];
        [operationC addDependency:operationB];
        
        //添加到操作队列中(自动异步执行任务,并发)
        [queue addOperation:operationA];
        [queue addOperation:operationB];
        [queue addOperation:operationC];
        
    }
    
    - (void)GCDSemaphore{
        /*
         dispatch_semaphore_signal  这个函数会使传入的信号量的值加1
         dispatch_semaphore_wait  这个函数会使传入的信号量的值减1
         */
        NSMutableArray *arr = [NSMutableArray array];
        //创建信号量,值为0
        dispatch_semaphore_t semaphore0 = dispatch_semaphore_create(0);
        dispatch_semaphore_t semaphore1 = dispatch_semaphore_create(0);
        
        //thread3
        //希望它是最后执行的,让它依赖thread2
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
            //DISPATCH_TIME_FOREVER表示一直等着,直到semaphore为0执行.
            //如果写15的话,就代表我只等15纳秒,15纳秒后,不管信号量是否为0,都执行下面的代码.
            //阻塞当前线程一直到semaphore1为0
            dispatch_semaphore_wait(semaphore1, DISPATCH_TIME_FOREVER);
            NSLog(@"最弱的,最后执行");
        });
        
        //thread2
        //等待thread1执行完毕后,执行thread2.(thread2依赖thread1)
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            //wait信号量-1(少一个可用资源)
            dispatch_semaphore_wait(semaphore0, DISPATCH_TIME_FOREVER);
            NSLog(@"依赖别人的资源");
            dispatch_semaphore_signal(semaphore1);
        });
        
        //thread1
        //这里有arr的赋值操作,需要最先执行,否则其他地方打印都为空
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
            for(int i = 0; i < 3; i ++)
            {
                [arr addObject:[NSNumber numberWithInt:i]];
            }
            NSLog(@"被依赖的资源 ---> %@",arr);
            //signal相当于信号量+1(多一个可用资源)
            dispatch_semaphore_signal(semaphore0);
        });
        
        
    }
     
  • 相关阅读:
    linux三剑客之grep
    MySQL练习(1)
    appium获取toast方法
    Could not parse UiSelector argument: 'XXX' is not a string 错误解决办法
    基于python的几种排序算法的实现
    生成allure测试报告之后,服务器端口无法访问查看生成的report,可能是这样引起的。
    通过源码看原理之 selenium
    如何查看浏览器记住的密码
    传智播客JavaWeb day09-mysql入门、数据库操作、数据库表操作、数据行操作
    SQLServer数据库表架构和数据保存成sql文件
  • 原文地址:https://www.cnblogs.com/whongs/p/9147927.html
Copyright © 2020-2023  润新知