1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 | - ( void )touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *) event { // GCD 开几条线程并不是我们可以控制的,而是系统来决定的, // [self asyncConcurrent]; // [self asyncSerial]; // [self syncConcurrent]; // [self syncSerial]; // [self test_get_global_queue];<br>// [self syncMain];//主线程操作直接死锁<br><br> [NSThread detachNewThreadSelector:@selector(syncMain) toTarget:self withObject:nil];//在子线程地调用,会直接执行,不会死锁<em id="__mceDel"> } /** 异步函数 + 并发队列 :会开启多条线程,队列中的任务是异步执行的(并发执行)(无序执行的) */ - ( void )asyncConcurrent{ //1.创建任务 /* 参数1:const char * _Nullable label , C语言参数 字符串 ,标识符,为了区分队列的 推荐写法:反着写 参数2:dispatch_queue_attr_t _Nullable attr,队列类型 DISPATCH_QUEUE_CONCURRENT 并发, DISPATCH_QUEUE_SERIAL 串行 */ dispatch_queue_t queue = dispatch_queue_create( "com.520it.www" , DISPATCH_QUEUE_CONCURRENT); //2 2.1封装任务 2.2添加到任务队列中 /** dispatch_async(<#dispatch_queue_t _Nonnull queue#>, <#^(void)block#>) 参数1:dispatch_queue_t _Nonnull queue 队列 参数2:<#^(void)block#> 要执行的任务 */ dispatch_async(queue, ^{ NSLog( @"打印一下111 --- %@" , [NSThread currentThread]); }); dispatch_async(queue, ^{ NSLog( @"打印一下222 --- %@" , [NSThread currentThread]); }); dispatch_async(queue, ^{ NSLog( @"打印一下333 --- %@" , [NSThread currentThread]); }); } /** 异步函数 + 串行队列:可以开启线程,但是串行队列只会在同一个子线程执行 */ - ( void )asyncSerial{ dispatch_queue_t queue = dispatch_queue_create( "asyncSerial" , DISPATCH_QUEUE_SERIAL); dispatch_async(queue, ^{ NSLog( @"打印一下111 --- %@" , [NSThread currentThread]); }); dispatch_async(queue, ^{ NSLog( @"打印一下222 --- %@" , [NSThread currentThread]); }); dispatch_async(queue, ^{ NSLog( @"打印一下333 --- %@" , [NSThread currentThread]); }); } /** 同步函数 + 并发队列 :不会会开启多条线程,不管后面是并发还是串行,任务是串行执行的 */ - ( void )syncConcurrent{ //1.创建任务 dispatch_queue_t queue = dispatch_queue_create( "com.520it.www" , DISPATCH_QUEUE_CONCURRENT); dispatch_sync(queue, ^{ NSLog( @"打印一下111 --- %@" , [NSThread currentThread]); }); dispatch_sync(queue, ^{ NSLog( @"打印一下222 --- %@" , [NSThread currentThread]); }); dispatch_sync(queue, ^{ NSLog( @"打印一下333 --- %@" , [NSThread currentThread]); }); } /** 同步函数 + 串行队列 :不会会开启多条线程,不管后面是并发还是串行,任务是串行执行的 */ - ( void )syncSerial{ dispatch_queue_t queue = dispatch_queue_create( "syncSerial" , DISPATCH_QUEUE_SERIAL); dispatch_sync(queue, ^{ NSLog( @"打印一下111 --- %@" , [NSThread currentThread]); }); dispatch_sync(queue, ^{ NSLog( @"打印一下222 --- %@" , [NSThread currentThread]); }); dispatch_sync(queue, ^{ NSLog( @"打印一下333 --- %@" , [NSThread currentThread]); }); } /** 获得全局队列 */ -( void )test_get_global_queue{ /** 获得全局并发队列 : 这个队列已经存在的, 我们只是获得 参数1 : long identifier 优先级, DISPATCH_QUEUE_PRIORITY_HIGH 2 DISPATCH_QUEUE_PRIORITY_DEFAULT 0 DISPATCH_QUEUE_PRIORITY_LOW (-2) DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN 这是最低的优先级 参数2 : unsigned long flags 给未来使用, 总是给个0 */ dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(queue, ^{ NSLog( @"打印一下111 --- %@" , [NSThread currentThread]); }); dispatch_async(queue, ^{ NSLog( @"打印一下222 --- %@" , [NSThread currentThread]); }); dispatch_async(queue, ^{ NSLog( @"打印一下333 --- %@" , [NSThread currentThread]); }); } </em> |
1.
2
3.
4.
5.
8.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现