1.dispatch_queue_create  创建队列开启异步线程(1,4,2,3)

  // 创建一个队列
dispatch_queue_t queue = dispatch_queue_create("my.test.queue", DISPATCH_QUEUE_CONCURRENT);
NSLog(@"");
// 开启一个异步线程
dispatch_async(queue, ^{
NSLog(@"");
// 线程等待10秒
[NSThread sleepForTimeInterval:];
NSLog(@"");
}); NSLog(@"");

2.创建队列开启同步线程(1,2,3,4)

    // 创建一个队列
dispatch_queue_t queue = dispatch_queue_create("my.test.queue", DISPATCH_QUEUE_CONCURRENT);
NSLog(@"");
// 开启一个同步线程
dispatch_sync(queue, ^{
NSLog(@"");
// 线程等待10秒
[NSThread sleepForTimeInterval:];
NSLog(@"");
}); NSLog(@"");

3.dispatch_get_global_queue 获取全局队列开启异步线程(1,4,2,3)

    NSLog(@"");
// 获取全局队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, );
// 开启一个异步线程
dispatch_async(queue, ^{
NSLog(@"");
[NSThread sleepForTimeInterval:];
NSLog(@"");
});
NSLog(@"");

4.获取全局队列开启同步线程 (1,2,3,4)

    NSLog(@"");
// 获取全局队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, );
// 开启一个同步线程
dispatch_sync(queue, ^{
NSLog(@"");
[NSThread sleepForTimeInterval:];
NSLog(@"");
});
NSLog(@"");

5.dispatch_get_main_queue()  获取主线程队列,再开启异步线程(1,4,2,3)

    NSLog(@"");
// 获取主线程队列
dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_async(queue, ^{
NSLog(@"");
[NSThread sleepForTimeInterval:];
NSLog(@"");
});
NSLog(@"");

6.获取主线程队列,再开启同步线程 (1) 。 线程会因为死锁,而永远卡死

    NSLog(@"");
// 获取主线程队列
dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_sync(queue, ^{
NSLog(@"");
[NSThread sleepForTimeInterval:];
NSLog(@"");
});
NSLog(@"");

总结:获取全局队列的名字是默认的,创建队列时可以自己命名队列的名字,其他用法都是一样的。个人认为同步线程意义不大

7.dispatch_get_main_queue()  回到主线程
    耗时操作需需要放在异步线程里,UI界面更新必须放在主界面里
    [2376:131819] 1111
    [2376:131819] 4444
    [2376:131860] 2222
    [2376:131860] 3333
    [2376:131819] 5555
    从打印结果来看(1,4,5是在主线程里面,2,3是在异步线程里面)

    NSLog(@"");
// 获取主线程队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, );
dispatch_async(queue, ^{
NSLog(@"");
[NSThread sleepForTimeInterval:];
// 回到主线程
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"");
});
NSLog(@"");
});
NSLog(@"");

8.dispatch_apply  执行某个片段N(6)次

    dispatch_apply(, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, ), ^(size_t index) {
NSLog(@"");
});

9.dispatch_barrier_async 是在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会执行 (2,1,3,4)

    dispatch_queue_t queue = dispatch_queue_create("gcdtest.rongfzh.yc", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:];
NSLog(@"");
});
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:];
NSLog(@"");
});
dispatch_barrier_async(queue, ^{
NSLog(@"333_barrier");
[NSThread sleepForTimeInterval:];
});
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:];
NSLog(@"");
});

10.dispatch_group_async 可以实现监听几组任务是否完成,完成后使用 dispatch_group_notify 执行其他的操作 (1,2,3,4)

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, );
// 创建一组任务
dispatch_group_t group = dispatch_group_create(); dispatch_group_async(group, queue, ^{
[NSThread sleepForTimeInterval:];
NSLog(@"");
});
dispatch_group_async(group, queue, ^{
[NSThread sleepForTimeInterval:];
NSLog(@"");
});
dispatch_group_async(group, queue, ^{
[NSThread sleepForTimeInterval:];
NSLog(@"");
});
// 监听所有组的任务完成之后执行,一般是回到主线程刷新UI界面
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"");
});

11.dispatch_once 对于某个任务执行一次,且只执行一次。 dispatch_once函数有两个参数,第一个参数predicate用来保证执行一次,第二个参数是要执行一次的任务block。

static dispatch_once_t predicate;
dispatch_once(&predicate, ^{
// some one-time task
});

暂时用到这么多,以后再用到会继续补充,也欢迎大家指出遗漏!

队列 和 线程 之GCD dispatch的更多相关文章

  1. iOS 并行编程:GCD Dispatch Sources

    1 简介 dispatch source是一种用于处理事件的数据类型,这些被处理的事件为操作系统中的底层级别.Grand Central Dispatch(GCD)支持如下的dispatch sour ...

  2. 拆开Ceph看队列和线程

    作者:吴香伟 发表于 2017/01/08 版权声明:可以任意转载,转载时务必以超链接形式标明文章原始出处和作者信息以及版权声明 我上小学时家离学校很远,家在某某山脚,学校在镇里.每周回家一趟,周五放 ...

  3. Android系统--输入系统(十七)Dispatcher线程_分发dispatch

    Android系统--输入系统(十七)Dispatcher线程_分发dispatch 1. 回顾 InputRead线程从输入设备当中得到输入事件 对于读到输入事件稍作处理,比如紧急事件,来电时候按下 ...

  4. 10.9 android输入系统_APP跟输入系统建立联系和Dispatcher线程_分发dispatch

    12. 输入系统_APP跟输入系统建立联系_InputChannel和Connection核心: socketpair // 第9课第3节_输入系统_必备Linux编程知识_任意进程双向通信(scok ...

  5. 自定义ThreadPoolExecutor带Queue缓冲队列的线程池 + JMeter模拟并发下单请求

    .原文:https://blog.csdn.net/u011677147/article/details/80271174 拓展: https://github.com/jwpttcg66/GameT ...

  6. python队列、线程、进程、协程

    目录: 一.queue 二.线程 基本使用 线程锁 自定义线程池 生产者消费者模型(队列) 三.进程 基本使用 进程锁 进程数据共享 默认数据不共享 queues array Manager.dict ...

  7. 6、TensorFlow基础(四)队列和线程

    队列和线程 和 TensorFlow 中的其他组件一样,队列(queue)本身也是图中的一个节点,是一种有状态的节点,其他节点,如入队节点(enqueue)和出队节点(dequeue),可以修改它的内 ...

  8. python队列、线程、进程、协程(转)

    原文地址: http://www.cnblogs.com/wangqiaomei/p/5682669.html 一.queue 二.线程 #基本使用 #线程锁 #自定义线程池 #生产者消费者模型(队列 ...

  9. 【Java并发】并发队列与线程池

    并发队列 阻塞队列与非阻塞队 ConcurrentLinkedQueue BlockingQueue ArrayBlockingQueue LinkedBlockingQueue PriorityBl ...

随机推荐

  1. jQuery中的end()方法

    定义和用法 end() 方法结束当前链条中的最近的筛选操作,并将匹配元素集还原为之前的状态. 以上是官方说法,比较难理解. 还是用一个例子来说明 <!DOCTYPE html> <h ...

  2. linux目录结构详解(以suse linux 10为例)

    一.文件系统结构 位于Linux系统的最顶端即根目录是/.Linux的文件系统的入口就是/,所有的目录.文件.设备都在/之下,/就是Linux文件系统的组织者,也是最上级的领导者. 它之下的子目录有: ...

  3. 12.常用类简单介绍.md

    目录 1.Scanner类 2.System类 4.Object类和工具类 5.StringBuffer类和StringBuilder类 6.Math类 7.Random类和ThreadLocalRa ...

  4. hexo发表博文的方式

    本图片转自:简书:https://www.jianshu.com/p/a52b68794a6b 转自github:https://blog.minhow.com

  5. http://wenku.baidu.com/view/26afdb8371fe910ef12df8ccRevit采用DWG和FBX两种格式导入3D max方法的总结

        2.DWG 属性——导出为 ACIS 实体(如果选择导出为多边形网格,则将每个图元导出为 由多个多边形组成的对象,这些多边形相互连接或组成 “ 网格 ” .在导出到 DWG 文件以用 于 Ma ...

  6. 吴裕雄 20-MySQL NULL 值处理

    MySQL NULL 值处理我们已经知道 MySQL 使用 SQL SELECT 命令及 WHERE 子句来读取数据表中的数据,但是当提供的查询条件字段为 NULL 时,该命令可能就无法正常工作.为了 ...

  7. yum源制作

    CentOS7 同步远程镜像 搭建本地yum服务器同步CentOS镜像站点的数据到本地服务器,使用nginx实现http服务向局域网内的其他机器提供yum服务,解决内网yum安装软件的问题. 一.前提 ...

  8. tensorflow 高级api使用分布式之配置

    """Constructor. Sets the properties `cluster_spec`, `is_chief`, `master` (if `None` i ...

  9. SAP 表类型

    最近看了一下ABAP的表类型相关知识,做一个自己的分析总结. ABAP的表类型似乎我感觉只应该有2种,而不是大家说的3种. 从数据存储的原理上来看的.下面我做一个分析. 一般情况下,我们都说ABAP中 ...

  10. canvas画布内部重复画圆

    <!DOCTYPE html><html><head> <title>canvas example</title> <meta cha ...