GCD线程依赖,GCD队列组,线程监听,线程等待

1.线程监听

有时候经常有这样的需求,AB任务都执行完成之后,刷新界面或者执行其他操作,

/**
 * 队列组 dispatch_group_notify
 */
- (void)groupNotify {
    NSLog(@"begin");

    dispatch_group_t group =  dispatch_group_create();

    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        // 追加任务1
        for (int i = 0; i < 2; ++i) {
            NSLog(@"任务1---%@",[NSThread currentThread]);      // 打印当前线程
        }
    });

    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        // 追加任务2
        for (int i = 0; i < 2; ++i) {
            NSLog(@"任务2---%@",[NSThread currentThread]);      // 打印当前线程
        }
    });

    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        // 等前面的异步任务1、任务2都执行完毕后,回到主线程执行任务
        for (int i = 0; i < 2; ++i) {
            NSLog(@"等待1,2完成后的任务3---%@",[NSThread currentThread]);      // 打印当前线程
        }
        NSLog(@"end");
    });
}

  

2.线程等待

暂停当前线程(阻塞当前线程),等待指定的 group 中的任务执行完成后,才会往下继续执行

从dispatch_group_wait相关代码运行输出结果可以看出:

当所有任务执行完成之后,才执行 dispatch_group_wait 之后的操作。但是,使用dispatch_group_wait 会阻塞当前线程。

/**
 * 队列组 dispatch_group_wait
 */
- (void)groupWait {

    NSLog(@"begin");

    dispatch_group_t group =  dispatch_group_create();

    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        // 追加任务1
        for (int i = 0; i < 2; ++i) {
            NSLog(@"任务1---%@",[NSThread currentThread]);      // 打印当前线程
        }
    });

    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        // 追加任务2
        for (int i = 0; i < 2; ++i) {
            NSLog(@"任务2---%@",[NSThread currentThread]);      // 打印当前线程
        }
    });

    // 等待上面的任务全部完成后,会往下继续执行(会阻塞当前线程)
    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);

    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        // 追加任务3
        for (int i = 0; i < 2; ++i) {
            NSLog(@"任务3---%@",[NSThread currentThread]);      // 打印当前线程
        }
    });

}

  

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px Menlo; color: #ffffff; background-color: #000000 }

原文地址:https://www.cnblogs.com/huangzhenwei/p/9728582.html

时间: 2024-08-29 18:29:46

GCD线程依赖,GCD队列组,线程监听,线程等待的相关文章

观察者模式实际应用:监听线程,意外退出线程后自动重启

摘要: 观察者模式,定义对象之间的一种一对多的依赖关系,当对象的状态发生改变时,所有依赖于它的对象都得到通知并且被自动更新.观察者模式在JDK中有现成的实现,java.util.Obserable. 首先说下需求:通过ftp上传约定格式的文件到服务器指定目录下,应用程序能实时监控该目录下文件变化,如果上传的文件格式符合要求,将将按照每一行读取解析再写入到数据库,解析完之后再将文件改名.(这个是原先已经实现了的功能,请看我的一篇文章java利用WatchService实时监控某个目录下的文件变化并

【MINA】OrderedThreadPoolExecutor和UnorderedThreadPoolExecutor的事件监听线程池的选择

mina中有两个线程池概念 1.处理监听建立连接的线程池  2.处理读写事件的线程池 本文中主要探讨读写事件的线程池的选择 这两种都经过实际项目的使用和检测,说说优缺点 早期的项目是用UnorderedThreadPoolExecutor[无序线程池] 特点:线程池管理一个无界阻塞队列,线程在分配事件,并发处理maximumPoolSize个事件, 后面来的事件在没有空闲线程的时候要进入这个无界阻塞队列等待执行 可以看出,他的特点是session之间是没有影响的,从事件的执行效率上要更高一些,但

OC 线程操作 - GCD队列组

队列组两种使用方 /** 新方法 队列组一般用在在异步操作,在主线程写队列组毫无任何作用 */ - (void)GCD_Group_new_group___notify{ dispatch_queue_t queue = dispatch_queue_create("11", DISPATCH_QUEUE_CONCURRENT); dispatch_queue_t globalqueue = dispatch_get_global_queue(0, 0); dispatch_group

IOS多线程知识总结/队列概念/GCD/主队列/并行队列/全局队列/主队列/串行队列/同步任务/异步任务区别(附代码)

进程:正在进行中的程序被称为进程,负责程序运行的内存分配;每一个进程都有自己独立的虚拟内存空间 线程:线程是进程中一个独立的执行路径(控制单元);一个进程中至少包含一条线程,即主线程 队列 dispatch_queue_t,队列名称在调试时辅助,无论什么队列和任务,线程的创建和回收不需要程序员操作,有队列负责. 串行队列:队列中的任务只会顺序执行(类似跑步) dispatch_queue_t q = dispatch_queue_create(“....”, DISPATCH_QUEUE_SER

Zookeeper 事件监听 - 史上最详解读

目录 写在前面 1.1. Curator 事件监听 1.1.1. Watcher 标准的事件处理器 1.1.2. NodeCache 节点缓存的监听 1.1.3. PathChildrenCache 子节点监听 1.1.4. Tree Cache 节点树缓存 写在最后 疯狂创客圈 亿级流量 高并发IM 实战 系列 疯狂创客圈 Java 分布式聊天室[ 亿级流量]实战系列之 -25[ 博客园 总入口 ] 写在前面 ? 大家好,我是作者尼恩.目前和几个小伙伴一起,组织了一个高并发的实战社群[疯狂创客

Windows API 教程(七) hook 钩子监听

Windows API 教程(七) hook 钩子监听 Posted on 2013-08-15 茵蒂克丝 如何创建一个窗口 手动创建窗口的流程 实际代码 安装钩子 (Install hook) 钩子简介 SetWindowsHookEx 函数 设置监听[键盘]消息 设置监听[鼠标]消息 如何创建一个窗口 另外一个再录的 Windows SDK教程 里面有讲到快捷创建窗口的方式,不过这样的话要分好几个文件,感觉有点混所以这里就用原始的方式创建一个窗口. 那么,为什么讲到 hook(钩子)的时候要

监听JVM关闭

使用Runtime的addShutdownHook(thread)方法: 1 for(int i=0; i<5; i++){ 2 System.out.println(i); 3 } 4 5 Thread th = new Thread(new Runnable() { 6 7 @Override 8 public void run() { 9 System.out.println("jvm结束了..."); 10 } 11 }); 12 //设置监听线程 13 Runtime.

lsnrctl start 命令未找到 数据库连接报错“ORA-12541: TNS: 无监听程序”

1. lsnrctl start 命令未找到 或者bash:lsnrctl:command not found. su - oralce        切换用户的时候,中间要有-,而且-的两边有空格,才能正确切换到oracle用户,否则会出现用户为找到,用户不存在错误: 2.数据库连接报错"ORA-12541: TNS: 无监听程序" 是因为数据库的监听线程未启动 (1)secureCRT连接到数据库所在的linux机器,切换到oracle用户模式下 [[email protected

android HorizontalScrollView实现滚动状态监听

网上大部分都是直接调用onScrollChanged(int x, int y, int oldx, int oldy) 这个方法的,实际上只是将这个方法的protected改为public而已,本质上上还是没有什么多大的帮助,不多说,直接上代码 package com.dzc.gallery; import android.content.Context; import android.os.Handler; import android.util.AttributeSet; import a