22day NSThread
来源:互联网 发布:winrar解压软件下载 编辑:程序博客网 时间:2024/06/11 23:06
重点:
NSThread
多线程基础、pthread、开启线程的3种方式线程的状态、线程安全问题、线程间的通信
GCD
同步方法和异步方法、队列的使用、线程间的通信延迟执行、一次性代码、队列组、单例模式-ARC、单例模式-MRC、用宏抽取单例模式
NSOperation
NSOperation和NSOperationQueue的概念理解、NSInvocationOperation、NSBlockOperationNSOperationQueue的常见方法、最大并发数、操作依赖、队列的取消\暂停\恢复
一、NSThread的基本使用
1、thread的演示
#import <pthread.h>@interface ViewController ()@end@implementation ViewControllervoid *run(void *data){ for (int i=0; i<10000; i++) { NSLog(@"%s,%@",__func__,[NSThread currentThread]); } return NULL;}- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ pthread_t *myrestrict; NSLog(@"%s,%@",__func__,[NSThread currentThread]); //创建线程 pthread_create(&myrestrict, NULL, run, NULL);}
2、线程安全(了解)
NSThread线程的创建
#pragma mark - 创建线程- (void) createThread1{ // 方式二:创建线程后自动启动线程 // [NSThread detachNewThreadSelector:@selector(run:) toTarget:self withObject:nil]; // 方式三:隐式创建并启动线程 [self performSelectorInBackground:@selector(run:) withObject:@"http://10.9.10.116/tlxy/pages"]; // [self performSelector:@selector(run:) withObject:nil];s//直接调用方法。不会创建线程 /* 方式二、方式三的优缺点: 优点:简单快捷 缺点:无法对线程进行更详细的设置 */}- (void) createThreadByinitWithTarget{ /* 线程的调度优先级(了解) + (double)threadPriority; + (BOOL)setThreadPriority:(double)p; - (double)threadPriority; - (BOOL)setThreadPriority:(double)p; 调度优先级的取值范围是0.0 ~ 1.0,默认0.5,值越大,优先级越高 */ NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(run:) object:nil]; [thread start];//Starts the receiver.进入就绪状态 [thread setName:@"lydia"];//设置线程名字}
线程安全
/** atomic:原子属性,为setter方法加锁(默认就是atomic) nonatomic:非原子属性,不会为setter方法加锁1、 nonatomic和atomic对比 atomic:线程安全,需要消耗大量的资源 nonatomic:非线程安全,适合内存小的移动设备 2、iOS开发的建议 1)所有属性都声明为nonatomic 2)尽量避免多线程抢夺同一块资源 3)尽量将加锁、资源抢夺的业务逻辑交给服务器端处理,减小移动客户端的压力 */@property (nonatomic,strong) NSThread *thread1;/** 安全隐患解决 – 互斥锁 @synchronized(锁对象) { // 需要锁定的代码 } 注意:锁定1份代码只用1把锁,用多把锁是无效的 1、互斥锁的优缺点 优点:能有效防止因多线程抢夺资源造成的数据安全问题 缺点:需要消耗大量的CPU资源 2、互斥锁的使用前提:多条线程抢夺同一块资源 ps:相关专业术语:线程同步 线程同步的意思是:多条线程在同一条线上执行(按顺序地执行任务) 互斥锁,就是使用了线程同步技术 */- (void)run{ while (1) { @synchronized(self) {//加锁 int count = self.poll; if (count>0) { [NSThread sleepForTimeInterval:0.1]; self.poll--; NSLog(@"%s---name:%@,poll = %d",__func__,[[NSThread currentThread] name],self.poll); }else{ break; } }//解锁 }}
可变的数组、字典、或者字符串不是线程安全的。
3、线程间的通讯
4、遍历数组或字典的方法
enumerateKeysAndObjectsUsingBlock
enumerateObjectsUsingBlock
#import <Foundation/Foundation.h>@implementation NSDictionary (Log)- (NSString *)descriptionWithLocale:(id)locale{ NSMutableString *str = [NSMutableString string]; [str appendString:@"{\n"]; // 遍历字典的所有键值对 [self enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { [str appendFormat:@"\t%@ = %@,\n", key, obj]; }]; [str appendString:@"}"]; // 查出最后一个,的范围 NSRange range = [str rangeOfString:@"," options:NSBackwardsSearch]; if (range.length != 0) { // 删掉最后一个, [str deleteCharactersInRange:range]; } return str;}@end@implementation NSArray (Log)- (NSString *)descriptionWithLocale:(id)locale{ NSMutableString *str = [NSMutableString string]; [str appendString:@"[\n"]; // 遍历数组的所有元素 [self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { [str appendFormat:@"%@,\n", obj]; }]; [str appendString:@"]"]; // 查出最后一个,的范围 NSRange range = [str rangeOfString:@"," options:NSBackwardsSearch]; if (range.length != 0) { // 删掉最后一个, [str deleteCharactersInRange:range]; } return str;}@end
阅读全文
0 0
- 22day NSThread
- NSThread
- NSThread
- NSThread
- NSThread
- NSThread
- NSThread
- NSThread
- NSThread
- NSThread
- NSThread
- NSThread
- NSThread
- NSThread
- NSThread
- NSThread
- NSThread
- NSThread
- python基础内容
- .NET简单的登录邮箱验证
- 查看两个TXT文本中内容的区别
- COM与DLL的区别
- 25岁做什么,可以让你在5年后受益匪浅?
- 22day NSThread
- java反射机制详解
- 位运算
- python 异常处理
- Hadoop环境安装设置
- Python,dict数据类型
- PHP Hash比较存在缺陷,影响大量Web网站登录认证、忘记密码等关键业务
- base64之前端加密后端解密
- 软件质量的定义