当前位置: 首页 > news >正文

ios多线程操作(五)—— GCD串行队列与并发队列

      GCD的队列能够分为2大类型,分别为串行队列和并发队列
     串行队列Serial Dispatch Queue
     一次仅仅调度一个任务,队列中的任务一个接着一个地运行(一个任务运行完成后,再运行下一个任务)
     创建一个队列
     dispatch_queue_t q = dispatch_queue_create(const char *label, dispatch_queue_attr_t attr)
     參数:
  const char *label:队列的名称
  dispatch_queue_attr_t attr:队列的属性,属性有两个,分别为:
     DISPATCH_QUEUE_SERIAL(NULL)   串行队列
     DISPATCH_QUEUE_CONCURRENT     并发队列
队列属性为宏。当中串行队列的宏值为NULL,所以创建一个串行队列能够用例如以下代码
dispatch_queue_t q = dispatch_queue_create(“chuanXing", NULL);
一个串行的异步任务演演示样例如以下
for (int i = 0; i < 10; ++i) {
        // 10 个异步
        dispatch_async(q, ^{
            NSLog(@“%@ - %d", [NSThread currentThread],i);
        });
    }
   
 NSLog(@"come here - %@“, [NSThread currentThread]);

运行结果例如以下


主线程运行时间并不确定,但将10个异步任务加入的串行队列中,不管怎样都会依次一个一个运行。并且仅仅会开启一条线程
假设将任务改为同步任务,那么执行结果可想而知(同步任务的特性)


     并发队列:
并发队列能够让多个觉得女巫并发(同一时候)运行,它会自己主动开启多个线程同一时候运行任务,并发功能仅仅有在异步函数下才会有效,比如有例如以下代码,并行队列下运行同步任务:
// 1. 队列
    dispatch_queue_t q = dispatch_queue_create("bingXing", DISPATCH_QUEUE_CONCURRENT);
    
    // 2. 同步运行
    for (int i = 0; i < 10; ++i) {
        dispatch_sync(q, ^{
            NSLog(@"%@ %d", [NSThread currentThread], i);
        });
    }
   
    NSLog(@"come here - %@",[NSThread currentThread]);


结果例如以下


并发队列下运行同步函数不会创建新线程,全部任务依次在主线程上运行。
再看看并发队列下运行异步函数
// 1. 队列
    dispatch_queue_t q = dispatch_queue_create("itheima", DISPATCH_QUEUE_CONCURRENT);
    
    // 2. 同步运行
    for (int i = 0; i < 10; ++i) {
        dispatch_async(q, ^{
            NSLog(@"%@ %d", [NSThread currentThread], i);
        });
    }
   
    NSLog(@"come here - %@",[NSThread currentThread]);

执行结果例如以下:

由此可知并行队列下地异步函数会开启N条子线程,且运行任务的顺序我们无法控制。至于是哪条线程运行任务由队列决定。哪个任务先完毕由CPU决定。结果中number = 4和number = 2的子线程运行了多次任务,那是由于这两条线程运行完任务就会被线程池回收,队列再从线程池中去线程运行任务,这时就会线程反复利用。假设没有线程则会又一次创建。





相关文章:

  • 推荐 30 款最好的免费项目管理软件
  • 【BZOJ2152】聪聪可可
  • 121231异机恢复oracle数据库
  • Atitit  文件上传  架构设计 实现机制 解决方案  实践java php c#.net js javascript  c++ python...
  • lvs+keepalived负载均衡及高可用
  • android 权限列表permission
  • rhle,centos,ubuntu相关工作笔记
  • float:left和float:right并不是没什么用。
  • .Net下使用 Geb.Video.FFMPEG 操作视频文件
  • Handler运行机制
  • 交换机端口利用
  • Phalcon资源文件管理(Assets Management)
  • 高清壁纸:2013年1月日历桌面壁纸免费下载
  • C# .NET开发图形图像程序时提示GDI+ 中发生一般性错误
  • centosx64 6.3安装firefox 17.0.1无法使用 flash
  • 【5+】跨webview多页面 触发事件(二)
  • eclipse的离线汉化
  • Idea+maven+scala构建包并在spark on yarn 运行
  • interface和setter,getter
  • JAVA 学习IO流
  • SOFAMosn配置模型
  • vue总结
  • 初识 webpack
  • 力扣(LeetCode)357
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 学习JavaScript数据结构与算法 — 树
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 译有关态射的一切
  • 硬币翻转问题,区间操作
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • (1)(1.13) SiK无线电高级配置(五)
  • (13):Silverlight 2 数据与通信之WebRequest
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (补)B+树一些思想
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (六)软件测试分工
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .NET下ASPX编程的几个小问题
  • @property @synthesize @dynamic 及相关属性作用探究
  • @require_PUTNameError: name ‘require_PUT‘ is not defined 解决方法
  • @RestController注解的使用
  • [C++]命名空间等——喵喵要吃C嘎嘎
  • [Excel] vlookup函数
  • [HDU] 1054 Strategic Game 入门树形DP
  • [iOS]把16进制(#871f78)颜色转换UIColor
  • [iOS开发]事件处理与响应者链
  • [J2ME]url请求返回参数非法(java.lang.illegalArgument)
  • [JavaEE系列] Thread类的基本用法
  • [LeetCode] 148. Sort List 链表排序
  • [LeetCode周赛复盘] 第 312 场周赛20220925