美文网首页
面试题-多线程-如何在N个任务都完成后才执行A任务

面试题-多线程-如何在N个任务都完成后才执行A任务

作者: 逃之不桃 | 来源:发表于2018-08-01 10:16 被阅读0次

方法一:使用dispatch_group

dispatch_group_t group = dispatch_group_create();
    for (int i=0; i<10; i++) {
        dispatch_group_enter(group);
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            sleep(1);
            printf("i = %d", i);
            dispatch_group_leave(group);
        });
    }
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        printf("开始执行任务A");
    });

方法二: 信号量实现

let sem = DispatchSemaphore.init(value: 0)
        for i in 0..<10 {
            DispatchQueue.global().async {
                sleep(UInt32(1))
                print("\(i)")
                sem.signal()
            }
            
        }
        for _ in 0..<10 {
            sem.wait()
        }
        DispatchQueue.main.async {
            print("开始执行任务A")
        }

方法三: 简单粗暴的bool数组,不推荐, 高并发容易崩溃

    self.arr = [[NSMutableArray alloc] init];
    for (int i=0; i<10; i++)
    {
        [self.arr addObject: [NSNumber numberWithBool:false]];
    }
    for (int i=0; i<10; i++) {
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            sleep(i);
            self.arr[i] = [[NSNumber alloc] initWithBool:true];
            if (![self.arr containsObject:[NSNumber numberWithBool:false]]) {
                NSLog(@"开始执行任务A");
            }
        });
    }

如果将sleep(i)改成sleep(1)就会发现崩溃了,原因是因为在遍历arr的时候对arr进行了修改。

相关文章

  • 面试题-多线程-如何在N个任务都完成后才执行A任务

    方法一:使用dispatch_group 方法二: 信号量实现 方法三: 简单粗暴的bool数组,不推荐, 高并...

  • Kotlin:该如何实现多线程同步?

    问题背景需执行多线程任务:任务1、任务2并行执行;等全部执行完成后,执行任务3。 实现方式「多线程同步」。Kotl...

  • iOS 多线程面试题(dispatch_group_async)

    dispatch_group_async 场景:在n个耗时并发任务都完成后,再去执行接下来的任务。比如,在n个网络...

  • iOS 控制任务执行顺序 OperationQueue

    控制任务执行的顺序 github地址YSSimpleOperation 情景 任务A依赖于任务a,b,c的完成后才...

  • 怎么让线程同步

    Dispatch Group 需要在大量任务都执行完成后,执行其他任务,可以用 Dispatch Group 对于...

  • dispatch_group_async

    需求:有5个任务,前面4个都是不耗时的,执行顺序无要求,第5个任务得在前4个任务都完成后执行。 实现这样的需求,办...

  • Java面试题——多线程

    Java面试题——多线程 1,什么是线程池? 线程池是多线程的一种处理方式,处理过程中将任务提交给线程池,任务执行...

  • 多线程

    了解多线程先了解 同步/异步 同步:多个任务情况下,一个任务A执行结束,才可以执行另一个任务B。只存在一个线程也就...

  • nextTick、setImmediate、promise.re

    执行队列(同步) 任务队列(异步事件) 每当异步任务完成后会在任务队列中添加一个关联事件,待执行队列任务执行完成...

  • iOS 常见面试题--GCD 队列组的使用

    面试题一:如何用gcd实现以下功能1、异步并发执行任务1、任务22、等任务1、任务2都执行完毕后,再回到主线程执行...

网友评论

      本文标题:面试题-多线程-如何在N个任务都完成后才执行A任务

      本文链接:https://www.haomeiwen.com/subject/fjrlvftx.html