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. Visual SVN Server备份脚本

    set tt=%date:~0,4%%date:~5,2%%date:~8,2% mkdir D:\SVN_BACKUP_%tt%\Repositories xcopy C:\Repositories ...

  2. mac下node安装提示command not found

    官网下载了node的.pkg文件安装node,安装好后,在mac终端下输入npm -v 和 node -v均提示 command not found,参考了网上的方法,终于得解 第一步:创建.bash ...

  3. [cocos2d-x]认识游戏开发(图)

    FreeMind的.mm文件下载: http://yunpan.cn/cfL3cm6CZkMSt (提取码:e01a)

  4. [PHP]PHP缓存机制之Output Control

    ---------------------------------------------------------------------------------------------------- ...

  5. Aop 中 JoinPoint等对象的用法Api

    @Aspect 定义类为切入类 @Pointcut 声明一个切入策略供 @Before @After @ Around @ AfterReturning选择 @Before 被切入方法执行前执行 @A ...

  6. 6.面向对象 -类.md

    目录 1. static: 2. 类在内存中,每一个类在创建在栈内存中,当创建一个对象的时候,将非类变量再堆内存中创建,而类变量是不会因为创建对象而在堆中重新创建 3. 对象.引用和指针: 4. 类名 ...

  7. Numpy知识(二)

    ndarray的简单数学计算就和普通的a+b,a-b,a*b,a/b等类似. 关于ndarray的切片: arr[n]:寻找第n个元素(针对一维)arr[n:m]:从下标为n元素开始,截取到下标为m- ...

  8. jstl-随机数-借用jsp嵌入的代码

    ) %></c:set> ${rand }

  9. 昆虫之膜翅目(Hymenoptera)

    1.简介 膜翅目昆虫(sawflies, wasps, ants, and bees,叶蜂.黄蜂目.蚂蚁目和蜜蜂目)是四大种类繁多的昆虫目之一,包括15.3万多种已知昆虫,可能还有多达100万种尚未发现 ...

  10. dns隧道 dns2tcpd

    有些网络的防火墙设置只允许端口53的UDP流量,就不能通过tcp搭建隧道,这种情况下我们可以通过UDP搭建DNS隧道,通过搭建一个DNS服务器委派的子域,这个子域因为使我们自己搭建的主机,这时候就可以 ...