美文网首页
dispatch_group_wait阻塞当前线程

dispatch_group_wait阻塞当前线程

作者: Jean_Lina | 来源:发表于2020-07-06 14:37 被阅读0次
  • dispatch_group_enter标志着一个任务追加到 group,执行一次,相当于 group 中未执行完毕任务数+1
  • dispatch_group_leave标志着一个任务离开了 group,执行一次,相当于 group 中未执行完毕任务数-1。
  • 当 group 中未执行完毕任务数为0的时候,才会使dispatch_group_wait解除阻塞,以及执行追加到dispatch_group_notify中的任务。
#pragma mark dispatch_group_enter、dispatch_group_leave
- (void)gcd_dispatch_group_enter_leave {
    //打印当前线程
    NSLog(@"currentThread---%@",[NSThread currentThread]);
    NSLog(@"group---begin");
    dispatch_group_t group = dispatch_group_create();
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_group_enter(group);
    dispatch_async(queue, ^{
        // 追加任务1
        for (int i = 0; i < 2; ++i) {
            //模拟耗时操作
            [NSThread sleepForTimeInterval:2];
            //打印当前线程
            NSLog(@"1---%@",[NSThread currentThread]);
        }
        dispatch_group_leave(group);
    });
    
    dispatch_group_enter(group);
    dispatch_async(queue, ^{
        // 追加任务2
        for (int i = 0; i < 2; ++i) {
            //模拟耗时操作
            [NSThread sleepForTimeInterval:2];
            //打印当前线程
            NSLog(@"2---%@",[NSThread currentThread]);
        }
        dispatch_group_leave(group);
    });
    
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        //等前面的异步操作都执行完毕后,回到主线程.
        for (int i = 0; i < 2; ++i) {
            //模拟耗时操作
            [NSThread sleepForTimeInterval:2];
            //打印当前线程
            NSLog(@"3---%@",[NSThread currentThread]);
        }
        NSLog(@"group---end");
    });
    NSLog(@"code end");
    //等待上面的任务全部完成后,会往下继续执行(会阻塞当前线程)
    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
    NSLog(@"等待上面的1,2任务全部完成后,会继续往下执行,阻塞当前线程");
}
屏幕快照 2020-07-06 下午2.35.19.png

相关文章

  • dispatch_group_wait阻塞当前线程

    dispatch_group_enter标志着一个任务追加到 group,执行一次,相当于 group 中未执行完...

  • DispatchGroup.wait()和DispatchGro

    wait()会等待线程执行完载执行之后的逻辑,阻塞当前线程 notify()不会阻塞当前线程,先执行notify后...

  • 同步、异步与串行、并发

    1、同步、异步描述的是当前线程或代码流是否要阻塞以等待加入队列的任务执行完毕;同步要阻塞当前线程,异步不会阻塞当前...

  • IOS多线程—GCD由浅入深总结

    注意几个名词: 同步:不会开启子线程, 而且会阻塞当前线程 异步:不会阻塞当前线程, 且具备开启线程的能力(不一定...

  • dispatch - 多线程 OR 单线程

    dispatch_async 不会阻塞当前线程 dispatch_async 会阻塞当前线程,一直等到它提交的任务...

  • 多线程

    import threadingimport time start是启动线程join是阻塞当前线程即使得在当前线程...

  • 01. 多线程Task做延迟操作

    1.异步执行,不会阻塞当前线程 2. 同步等待,当前线程会等三秒完后继续往下执行 3. 异步,不阻塞当前线程的执行...

  • Swift GCD 的串行队列与并行队列

    队列异步是否阻塞当前线程同步是否阻塞当前线程执行顺序串行队列否是按添加顺序并行队列否是同时执行,但会被同步阻塞 串...

  • swift semaphore信号量

    信号量是可以用来阻塞当前线程,设置value不同,可以有多种使用场景。1 value为0,阻塞当前线程,线程等待2...

  • 线程控制方法

    1.sleep()方法 使当前线程进入阻塞状态,可设置阻塞的时间。 2.yield()方法 使当前线程让步方法,使...

网友评论

      本文标题:dispatch_group_wait阻塞当前线程

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