GCD中的队列与任务组合对比

  • 在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(@"开启新线程,任务是无序的");
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zok93

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值