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

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

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

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

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

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

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

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

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

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

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

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

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

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(@"1111");// 获取主线程队列dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);dispatch_async(queue, ^{NSLog(@"2222");[NSThread sleepForTimeInterval:5];// 回到主线程dispatch_async(dispatch_get_main_queue(), ^{NSLog(@"5555");});NSLog(@"3333");});NSLog(@"4444");

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

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

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:3];NSLog(@"111");});dispatch_async(queue, ^{[NSThread sleepForTimeInterval:2];NSLog(@"222");});dispatch_barrier_async(queue, ^{NSLog(@"333_barrier");[NSThread sleepForTimeInterval:4];});dispatch_async(queue, ^{[NSThread sleepForTimeInterval:1];NSLog(@"444");});

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

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

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

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

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

转载于:https://www.cnblogs.com/shen5214444887/p/4917343.html

队列 和 线程 之GCD dispatch相关推荐

  1. Java多线程闲聊(四):阻塞队列与线程池原理

    Java多线程闲聊(四)-阻塞队列与线程池原理 前言 复用永远是人们永恒的主题,这能让我们更好地避免重复制造轮子. 说到多线程,果然还是绕不开线程池,那就来聊聊吧. 人们往往相信,世界是存在一些规律的 ...

  2. 6.1 Tensorflow笔记(基础篇):队列与线程

    前言 在Tensorflow的实际应用中,队列与线程是必不可少,主要应用于数据的加载等,不同的情况下使用不同的队列,主线程与其他线程异步进行数据的训练与读取,所以队列与线程的知识也是Tensorflo ...

  3. java 阻塞锁_Java实现锁、公平锁、读写锁、信号量、阻塞队列、线程池等常用并发工具...

    锁的实现 锁的实现其实很简单,主要使用Java中synchronized关键字. public class Lock { private volatile boolean isLocked = fal ...

  4. 并发队列、线程池、锁

    1.CountDownLatch(计数器)      CountDownLatch 类位于java.util.concurrent包下,利用它可以实现类似计数器的功能.比如有一个任务A,它要等待其他任 ...

  5. 【JUC】第五章 JUC 阻塞队列、线程池

    第五章 JUC 阻塞队列.线程池 文章目录 第五章 JUC 阻塞队列.线程池 一.阻塞队列 1.简介 2.BlockingQueue 的方法 3.常见的 BlockingQueue 二.线程池 1.简 ...

  6. 【详解】消息队列和线程关系

    1.进程-线程-消息队列 简单的来说,什么是进程?什么是线程?打个比方,你的程序要执行,操作系统就会把你的exe文件加载到内存中,那就生成一个进程了(当然还包含分配到的资源等):对于线程,你可以理解成 ...

  7. Java队列、线程池及ThreadPoolExecutor自定义线程池实现

    目录 1.阻塞队列 2.队列分类 3.API使用 4.线程池 4.1.线程池参数 4.2.线程池实现 4.3.任务执行流程 4.4.拒绝策略 4.5.参数合理值设置 5.自定义线程池流程 6.自定义线 ...

  8. 线程和并发(三)阻塞队列和线程池

    concurrent之atomic相关 概述 java.util.concurrent.atomic原子操作类包里面提供了一组原子变量类.其基本的特性就是在多线程环境下,当有多个线程同时执行这些类的实 ...

  9. 五、线程管理————GCD

    本文只对GCD的其他操作进行一些补充. 1.延迟操作 实例: //延时操作     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)( ...

最新文章

  1. AWS论剑Azure:安全组之争
  2. DM8168心得之SD卡快速分区制作
  3. 美国互联网巨头在华发展10大败因
  4. CSS 中的内联元素、块级元素以及display的各个属性的特点
  5. 联想计算机如何设置用户名和密码,联想电脑怎样设密码?联想电脑设置密码方法步骤【图文】...
  6. PAT乙:1022 D进制的A+B
  7. 遗传算法MATLAB工具箱的下载与安装
  8. Vue学习笔记之16-tarbar地开发思路
  9. dotnet html 桌面开发,用HTML,Vue+element-UI做桌面UI
  10. selenium+python处理JS弹窗
  11. LLVM LLD COFF格式分析
  12. 2022年ps应该选择哪个版本
  13. 机器学习——决策树(ID3)的实现
  14. Java8新特性(三) – 流式数据处理
  15. TSX常见简单用法(入门) Vue3+Vite
  16. 如何改电脑用户名WIN10/WIN11
  17. 任意多边形面积的计算
  18. 检测MSWORD.OLB是否注册及注册的代码
  19. ingress controller安装总结
  20. 疯狂Java讲义(五)----第二部分

热门文章

  1. python异步io多文件_Python 异步 IO 性能又上一层楼
  2. java冒泡排序_JAVA实现经典排序算法(冒泡排序、选择排序、插入排序、希尔排序、堆排序、归并排序、快速排序)...
  3. Android课程设计倒计时app,单片机课程设计-可调倒计时器.doc
  4. sql int 转string_SQL智能代码补全引擎【sql-code-intelligence】介绍
  5. 中国牡蛎碳酸钙市场需求现状调研及十四五投资风险评估报告2022-2028年版
  6. android 数字证书具体应用机制
  7. 跨界巨头谋定现代农业-农民丰收节交易会:全产业链布局
  8. 基于墨刀的软件界面原型设计——小说搜索阅读软件
  9. Oracle经典教程学习笔记
  10. 尝试在centos5下运行phantomjs2