博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
GCD中的队列与任务组合对比
阅读量:4092 次
发布时间:2019-05-25

本文共 2324 字,大约阅读时间需要 7 分钟。

  • 在GCD队列中,队列的类型不是决定是否开启线程的
  • 队列的类型是决定调度方式的
    • 串行队列:每次只调度一个任务,也可以开启子线程
    • 并行队列:每次可调度多个任务,一定可以开启子线程
  • 串行队列的调度方式决定了它开启再多的线程也没有用,所以只有当它遇到异步任务的时候才会新开一个线程,因为他的调度方式决定了他开一个就够了
  • 决定是否开启线程:
    • 同步任务:不开线程,并且无论在串行还是并行队列中都有序执行
    • 异步任务:开线程 ,只能在并行队列中乱序执行
"串行队列:我同时只能调度一个任务诶...虽然我也能开启子线程,但我就能调度一个任务.....""同步任务:没关系啊,我本来就是一个一个被调度执行的呢""串行对列:这样喔...那我们就不用开线程了呢,按顺序执行就好了~"#pragma mark - 串行队列 + 同步任务// 不开线程(同步任务只在当前线程执行)// 顺序执行(串行队列是按顺序调度任务执行的,而且任务又是同步任务)- (void)GCDDemo{    // 1.创建串行队列    dispatch_queue_t queue = dispatch_queue_create("LONG", DISPATCH_QUEUE_SERIAL);    // 循环的把多个同步任务添加到串行队列    for (NSInteger i = 0; i < 10; i++) {        // 2.把同步任务添加到串行队列        dispatch_sync(queue, ^{            NSLog(@"%zd %@",i,[NSThread currentThread]);        });    }    NSLog(@"不开线程,任务依次在当前线程执行"); }
"串行队列:我同时只能调度一个任务诶...虽然我也能开启子线程,但我就能调度一个任务.....""异步任务:不行,我就要开线程,妈妈说我是可以被多个同时调度的,我要在子线程执行!!!""串行对列:好吧,那我就给你开一个子线程吧,开多了也没用呢,因为我只能同时调度一个任务哦""异步任务:好吧好吧,那你就开一个子线程吧"#pragma mark - 串行队列 + 异步任务// 开线程,只开一个子线程,一个就够了// 顺序执行,(串行队列是按顺序调度任务执行的)- (void)GCDDemo{    // 1.创建串行队列    dispatch_queue_t queue = dispatch_queue_create("LONG", DISPATCH_QUEUE_SERIAL);    for (NSInteger i = 0; i < 10; i++) {        // 2.把异步任务添加到串行队列        dispatch_async(queue, ^{            NSLog(@"%zd %@",i,[NSThread currentThread]);        });    }    NSLog(@"在一个新的子线程执行,并且有序执行");}

在GCD的队列和任务中

当队列是并行队列时:
- 任务是同步的,那么任务一定是同步执行的,并且不开线程(按顺序执行,FIFO)
- 任务是异步的时候,任务才会异步执行,开启多个线程

"并行队列:我可以同时调度多个任务,所以能开多个线程哦!""同步任务:不,我就要一个一个调度执行""并行队列:哦,好吧,那我不开线程了,浪费...就用一个主线程吧"#pragma mark - 并行队列 + 同步任务// 不开线程(任务是同步的)// 有序(任务是同步的,队列遵守FIFO)- (void)GCDDemo{    // 1.创建并行队列    dispatch_queue_t queue = dispatch_queue_create("LONG", DISPATCH_QUEUE_CONCURRENT);    for (NSInteger i = 0; i < 10; i++) {        // 2.把同步任务添加到并行队列        dispatch_sync(queue, ^{            NSLog(@"%zd %@",i,[NSThread currentThread]);        });    }    NSLog(@"不开线程,任务依次执行");}

"并行队列:我可以同时调度多个任务,所以能开多个线程哦!""异步任务:好啊好啊,我正好着急,想多个任务一起执行呢""并行队列:来吧,我要开启多个线程了,但是不能保证顺序哦..而且主线程不算我的子线程范围呢""异步任务:没关系,我不在乎顺序,能完成就好"#pragma mark - 并行队列 + 异步任务// 开线程// 任务无序- (void)GCDDemo{    // 1.创建并行队列    dispatch_queue_t queue = dispatch_queue_create("LONG", DISPATCH_QUEUE_CONCURRENT);    for (NSInteger i = 0; i < 10; i++) {        // 2.把异步任务添加到并行队列        dispatch_async(queue, ^{            NSLog(@"%zd %@",i,[NSThread currentThread]);        });    }    NSLog(@"开启新线程,任务是无序的");}

转载地址:http://yfkii.baihongyu.com/

你可能感兴趣的文章
C#多线程代码调试技巧
查看>>
Caffe学习系列(6):Blob,Layer and Net以及对应配置文件的编写
查看>>
ELK安装与配置
查看>>
系统启动过程
查看>>
Java中使用Runtime和Process类运行外部程序
查看>>
33.Android之Fragment学习
查看>>
Codeforces 916E(思维+dfs序+线段树+LCA)
查看>>
SpringMVC @RequestBody请求参数在postman中的请求
查看>>
Spring boot设置文件上传大小限制
查看>>
Http请求消息Request、响应消息Response
查看>>
在win10环境下安装虚拟机并运行win7系统步骤
查看>>
查看磁盘或者文件的容量
查看>>
使用Visual Studio Code创建第一个ASP.NET Core应用程序
查看>>
ubuntu16.04配置anaconda环境
查看>>
[转]LocalDB数据库修改排序规则,修复汉字变问号
查看>>
css常用单位
查看>>
apache 列目录修复
查看>>
Codeforces Round #318 [RussianCodeCup Thanks-Round] (Div. 2)C. Bear and Poker
查看>>
ZVRK函数
查看>>
【函数】fill和fill_n填充之区别
查看>>