//测试第一个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