浅谈多线程——NSThread
上一篇文章中我们大致了解了GCD的模式和方法,在iOS开发中除了GCD之外,还有NSThread和NSOperation两种多线程方式。
1.NSThread
- a - 使用NSThread开辟多线程进行子任务处理:类方法和初始化方法
使用类方法不需要创建对象就可以直接开辟多线程并发;而创建NSThread对象进行开辟则需要使用 - (void)start 方法进行线程启动。
1 #import "ViewController.h" 2 3 typedef NS_ENUM(NSInteger, ENSThreadType) { 4 kNSThreadClassFunc, 5 kNSThreadInitFunc, 6 }; 7 8 @interface ViewController () 9 10 @end 11 12 @implementation ViewController 13 14 - (void)viewDidLoad { 15 [super viewDidLoad]; 16 17 [self threadWithType:kNSThreadInitFunc times:10]; 18 19 } 20 21 - (void)threadWithType:(ENSThreadType)type times:(int)time{ 22 for(int i = 0; i < time; i++){ 23 NSString *str = [NSString stringWithFormat:@"测试+%d", i]; 24 25 switch (type) { 26 case kNSThreadClassFunc:{ 27 // ①类方法 28 [NSThread detachNewThreadSelector:@selector(func:) toTarget:self withObject:str]; 29 } 30 break; 31 case kNSThreadInitFunc:{ 32 // ②初始化方法 33 NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(func:) object:str]; 34 thread.name = str; 35 [thread start]; 36 } 37 break; 38 default: 39 break; 40 } 41 42 } 43 } 44 45 - (void)func:(NSString*)str{ 46 NSLog(@"%@ %@", str, [NSThread currentThread]); 47 } 48 49 @end
- b - NSThread实例方法,创建了NSThread对象后,可以调用它的实例方法:
1 #import "ViewController.h" 2 3 typedef NS_ENUM(NSInteger, ENSThreadObjFunc) { 4 // kThreadObjFuncThread, 5 kThreadObjFuncMain, 6 kThreadObjFuncBackground, 7 }; 8 9 @interface ViewController () 10 { 11 NSThread *aThread; 12 } 13 @end 14 15 @implementation ViewController 16 17 - (void)viewDidLoad { 18 [super viewDidLoad]; 19 20 aThread = [[NSThread alloc] initWithTarget:self selector:@selector(func:) object:@"测试参考线程"]; 21 [aThread start]; 22 23 [self threadObjFuncWithType:kThreadObjFuncMain thread:aThread times:10]; 24 25 } 26 27 - (void)func:(NSString*)str{ 28 NSLog(@"%@ %@", str, [NSThread currentThread]); 29 } 30 31 - (void)threadObjFuncWithType:(ENSThreadObjFunc)type thread:(NSThread*)thread times:(int)time{ 32 33 for(int i = 0; i < time; i ++){ 34 switch (type) { 35 case kThreadObjFuncMain:{ 36 // ①主线程队列中执行,同步 37 NSString *str = [NSString stringWithFormat:@"主线程队列+%d", i]; 38 [self performSelectorOnMainThread:@selector(func:) withObject:str waitUntilDone:YES]; 39 } 40 break; 41 case kThreadObjFuncBackground:{ 42 // ②后台执行,并行异步 43 NSString *str = [NSString stringWithFormat:@"后台执行+%d", i]; 44 [self performSelectorInBackground:@selector(func:) withObject:str]; 45 } 46 break; 47 // case kThreadObjFuncThread:{ 48 // ③在某一线程队列执行,类似于串行异步 49 // NSString *str = [NSString stringWithFormat:@"方法+%d", i]; 50 // [self performSelector:@selector(func:) onThread:thread withObject:str waitUntilDone:YES]; 51 // } 52 // break; 53 default: 54 break; 55 } 56 } 57 } 58 59 @end
转载于:https://www.cnblogs.com/kriskee/p/5368155.html
浅谈多线程——NSThread相关推荐
- 浅谈多线程——NSOperation
iOS中多线程相关方法--NSOperation及其相关类: NSOperation NSBlockOperation NSInvocationOperation NSOperationQueue 1 ...
- 为什么cpu要一心二用:浅谈多线程编程的一个具体例子
什么是多线程,多线程就是多个执行序列.就是让cpu执行下这个序列,又执行下那个序列,不停地切换, 正所谓一心二用. 考虑一个实际场景: 客户端要向服务端发送文件,服务端会对发送文件进行检查,如果文件的 ...
- 浅谈多核CPU、多线程与并行计算
浅谈多核CPU.多线程与并行计算 xiaofei0859 2017-05-09 17:07:11 3646 收藏 展开 0.前言 笔者用过MPI和C#线程池,参加过比赛,有所感受,将近一年来,对多 ...
- 多线程之旅之四——浅谈内存模型和用户态同步机制
用户态下有两种同步结构的 volatile construct: 在简单数据类型上原子性的读或者写操作 interlocked construct:在简单数据类型上原子性的读和写操作 (在这里还 ...
- java 多线程同步_浅谈Java多线程(状态、同步等)
Java多线程是Java程序员必须掌握的基本的知识点,这块知识点比较复杂,知识点也比较多,今天我们一一来聊下Java多线程,系统的整理下这部分内容. 一.Java中线程创建的三种方式: 1.通过继承T ...
- js打印线程id_浅谈python中的多线程和多进程(二)
原创:hxj7 本文继续分享一个关于python多线程和多进程区别的例子 前文<浅谈python中的多线程和多进程>中我们分享过一个例子,就是分别利用python中的多线程和多进程来解决高 ...
- linux的多任务 多进程,浅谈linux模拟多线程崩溃和多进程崩溃
结论是: 多线程下如果其中一个线程崩溃了会导致其他线程(整个进程)都崩溃: 多进程下如果其中一个进程崩溃了对其余进程没有影响: 多线程 #include #include #include #incl ...
- 获得进程id_浅谈python中的多线程和多进程(二)
原创:hxj7 本文继续分享一个关于python多线程和多进程区别的例子 前文<浅谈python中的多线程和多进程>中我们分享过一个例子,就是分别利用python中的多线程和多进程来解决高 ...
- 【kafka】浅谈Kafka的多线程消费的设计
1.概述 转载:浅谈Kafka的多线程消费的设计 看原文去... 一.前言 跟RabbitMQ相比,Kafka的分区机制(Partition)使其支持对同一个"队列"分片并行读取, ...
最新文章
- 理解什么是MyBatis?
- Visual Transformers: Token-based Image Representation and Processing for Computer Vision
- Install FileZilla in Ubuntu16.04
- 用Pytorch实现三个优秀的自然图像分割框架!(包括FCN、U-Net和Deeplab,可直接训练预测)
- Logstash同步mysql一对多数据到ES(踩坑日记系列)
- [C++学习笔记](double*)malloc(n * sizeof(double));
- controller方法要trycatch吗_拜托,别再满屏try catch了,试试统一异常处理吧
- struct 和enum的用法
- 【英语学习】【Daily English】U06 Shopping L04 I like everything aboutit but the price.
- Android 系统(38)---Android抓取各种log的方法
- 关于字符串和字符数组的再讨论
- 一天一种设计模式之三-----单例模式
- iec104点号_IEC104规约详细讲解全解.ppt
- APUE读书笔记-06系统数据文件和信息-03加密密码
- 物流软件之Microcity介绍
- 【计算机网络】网络层 : RIP 协议 ( 路由选择协议分类 | RIP 协议简介 | 信息交换 | 距离向量算法 | 计算示例 )★
- DBV命令行工具检测坏块
- TUIO学习笔记1-TUIO 1.1 Protocol Specification协议规范/标准
- JavaScript设计模式-观察者模式
- XSS.haozi.me刷题
热门文章
- python人工智能方向第三方库_Python进阶-第三方库管理和虚拟环境
- C++函数后置返回类型
- 可禁用计算机服务,win10哪些服务可以禁用 服务哪些可以禁止启动
- 光端机使用过程中碰到的九大问题
- 【渝粤教育】国家开放大学2018年秋季 0551-22T素描(二) 参考试题
- 【渝粤题库】陕西师范大学400006 公共关系学 作业(专升本)
- [渝粤教育] 西南科技大学 电器设备及维修 在线考试复习资料
- 【渝粤题库】陕西师范大学202091公共管理学原理 作业(高起本、专升本)
- 【渝粤题库】国家开放大学2021春3990产品管理题目
- zigbee与WiFi模块和蓝牙模块的区别是什么?