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;