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