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;
相关文章推荐
- IOS线程数据篇3之多线程:NSThread NSOperation GCD(二)
- iOS学习总结之多线程编程(NSThread)-线程的状态
- iOS--线程间通讯NSThread--04
- iOS NSThread 的三种创建线程的方法 非常简单好用
- ios之NSThread开辟子线程方法
- iOS 开发 多线程详解之NSThread线程通信的操作与控制
- iOS-多线程(NSThread-线程之间的通信)
- iOS NSThreadGCD 线程与队列(二)
- iOS 线程 NSCondition NSThread
- ios NSThread 线程锁,多线程下载图片
- iOS-多线程(NSThread-线程的状态)
- iOS多线程_05_线程间通信NSThread/GCD
- iOS -- 线程 还有待补全--(关于线程死锁,解决办法等。。)(NSThread、NSOperation、GCD) -- ASI/AFNetWork
- iOS-开辟子线程(NSThread、NSOperationQueue、GCD)
- iOS开发之多线程(NSThread创建线程)
- ios线程第二发: NSThread(附录1)
- IOS线程数据篇2之多线程:NSThread NSOperation GCD(一)
- iOS 开发 多线程详解之NSThread异步线程下载网络图片
- iOS - 线程(NSThread / NSOperation / GCD)
- iOS NSthread & Thread 开启线程的几种方式