您的位置:首页 > 移动开发 > IOS开发

iOS线程之NSThread

2016-11-09 22:42 369 查看

NSThread

一、创建方法

使用initWithTarget方法,有返回值

NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run:) object:@"jack"];


使用detachNewThreadSelector方法,没有返回值

[NSThread detachNewThreadSelector:@selector(run:) toTarget:self withObject:@"rose"];


使用performSelectorInBackground方法,没有返回值

[self performSelectorInBackground:@selector(run:) withObject:@"maple"];


二、常用方法

获得主线程

+ (NSThread *)mainThread;


是否为主线程

- (BOOL)isMainThread;
+ (BOOL)isMainThread;


获得当前线程

NSThread *current = [NSThread currentThread];


三、线程的状态

线程的状态图



控制线程状态的方法

启动线程

- (void)start;


阻塞线程

+ (void)sleepUntilDate:(NSDate *)date;
+ (void)sleepForTimeInterval:(NSTimeInterval)ti;


强制停止线程

+ (void)exit;


四、多线程安全的安全隐患

出现的问题

当多个线程同时访问同一个资源的时候,很容易引发数据错乱和数据安全的问题,如买票,取钱等问题

解决方法–互斥锁

互斥锁使用格式

@synchronized(锁对象) { // 需要锁定的代码 }

锁对象必须是同一对象,并且锁定1份代码只用1把锁,多把锁是无效的

互斥锁的优缺点

优点:能有效防止多线程强占同一资源造成的安全问题

缺点:需要消耗大量CPU资源

互斥锁的使用前提

多个线程使用同一资源

原子属性,非原子属性

OC在定义属性时有nonatomic和atomic两种选择

atomic:原子属性,为setter方法加锁(默认就是atomic)

nonatomic:非原子属性,不会为setter方法加锁

五、线程间的通信

简介

在一个进程中,线程往往不是独立存在的,多个线程之间需要经常通信

线程的通信体现在

1个线程传递数据给另1个线程

在1个线程中执行完特定任务后,转到另1个线程继续执行任务

常用方法

- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: