关于GCD线程顺序的几个题,认识一下

//测试第一个CGD的运行结果

    dispatch_queue_t queue = dispatch_queue_create("test", DISPATCH_QUEUE_CONCURRENT);

    NSLog(@"1");//主线程

    //同步

    dispatch_sync(queue, ^{

        NSLog(@"2");//分线程

        //同步

        dispatch_sync(queue, ^{

            NSLog(@"3");//分线程

        });

        NSLog(@"4");//分线程

    });

    NSLog(@"5");//主线程

    //结果输出:1、2、3、4、5

    

    //测试第二个CGD的运行结果

    NSLog(@"111");//主线程

    //异步

    dispatch_async(dispatch_get_global_queue(0, 0), ^{

        NSLog(@"222");//分线程

        //同步

        dispatch_sync(dispatch_get_main_queue(), ^{

            NSLog(@"333");//主线程

        });

        NSLog(@"444");//分线程

    });

    NSLog(@"555");//主线程

    //结果输出:1、5、2、3、4

    

    //测试第三个CGD的运行结果

    NSLog(@"1..");//主线程

    //同步

    dispatch_sync(dispatch_get_main_queue(), ^{

        NSLog(@"2..");//主线程

    });

    NSLog(@"3..");//主线程

    //结果输出:只有1,然后崩掉了,因为造成了线程锁死

    /**

     原因:对于主队列无论是同步异步都不会创建线程,而且主队列中的任务只有在主线程空闲的时候才会执行.如果是主队列同步会造成互相等待而锁死.主队列同步任务等待主线程执行,主线程之后的任务等待主队列任务完成。

     

     解决办法:在主队列外面套一层并发队列的异步任务.或者使用主队列异步任务

     **/

    //解决第三个GCD线程锁死

    NSLog(@"1..");//主线程

    //异步

    dispatch_async(dispatch_get_main_queue(), ^{

        NSLog(@"2..");//主线程

    });

    NSLog(@"3..");//主线程

    //结果输出:1、3、2

2024.04.01新增场景一:一个串行队列,先放入异步,再放入同步,结果显示按顺序执行;

如果先放入同步,再放入异步,结果“1--......”在最后输出;

如果一个并行队列,无论先放入异步还是同步,结果都是“1--......”在最后输出;

NSLog(@"currentThread---%@",[NSThread currentThread]);

NSLog(@"begin");

    dispatch_queue_t queue = dispatch_queue_create(NSStringFromClass([self class]).UTF8String, DISPATCH_QUEUE_SERIAL);

    dispatch_async(queue, ^{

        // 追加任务 1

        [NSThread sleepForTimeInterval:2];              // 模拟耗时操作

        NSLog(@"1---%@",[NSThread currentThread]);      // 打印当前线程

    });

    dispatch_sync(queue, ^{

        // 追加任务 2

        [NSThread sleepForTimeInterval:2];              // 模拟耗时操作

        NSLog(@"2---%@",[NSThread currentThread]);      // 打印当前线程

    });

    NSLog(@"end");

运行结果:

2024-04-01 14:05:39.600752+0800 SmoothDemo[763:32673] currentThread---<_NSMainThread: 0x280a14900>{number = 1, name = main}

2024-04-01 14:05:39.600796+0800 SmoothDemo[763:32673] begin

2024-04-01 14:05:41.602374+0800 SmoothDemo[763:32917] 1---<NSThread: 0x280a52b00>{number = 4, name = (null)}

2024-04-01 14:05:43.604089+0800 SmoothDemo[763:32673] 2---<_NSMainThread: 0x280a14900>{number = 1, name = main}

2024-04-01 14:05:43.604459+0800 SmoothDemo[763:32673] end

20240401新增场景二:一个串行队列,放入异步,异步中嵌套同步,结果显示在同步处死锁崩溃,因为串行要等上一个任务执行完,才能执行下一个任务,嵌套的同步串行任务是在上一个任务没有执行完之前添加的,所以永远也等不到上一个任务执行完

NSLog(@"currentThread---%@",[NSThread currentThread]);

NSLog(@"begin");

    dispatch_queue_t queue = dispatch_queue_create(NSStringFromClass([self class]).UTF8String, DISPATCH_QUEUE_SERIAL);

    dispatch_async(queue, ^{

        // 追加任务 1

        [NSThread sleepForTimeInterval:2];              // 模拟耗时操作

        NSLog(@"1---%@",[NSThread currentThread]);      // 打印当前线程

        dispatch_sync(queue, ^{

            // 追加任务 2

            [NSThread sleepForTimeInterval:2];              // 模拟耗时操作

            NSLog(@"2---%@",[NSThread currentThread]);      // 打印当前线程

        });

    });

    NSLog(@"end");
运行结果:
2024-04-01 14:11:00.177595+0800 SmoothDemo[801:34497] currentThread---<_NSMainThread: 0x2835f0900>{number = 1, name = main}
2024-04-01 14:11:00.177644+0800 SmoothDemo[801:34497] begin
2024-04-01 14:11:00.177682+0800 SmoothDemo[801:34497] end
2024-04-01 14:11:02.183260+0800 SmoothDemo[801:34739] 1---<NSThread: 0x2835a4180>{number = 3, name = (null)}
(lldb) 

知识点看我的这篇博客:http://blog.csdn.net/hbblzjy/article/details/51235990

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

hbblzjy

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

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

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

打赏作者

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

抵扣说明:

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

余额充值