iOS多线程之NSThread
jopen
9年前
最近有时间想把多线程相关的内容整理一下,因为以前学的不够系统,有错误地方请指正。iOS中有关多线程的技术方案主要有3中方式:
1.NSThread oc语言实现,线程的生命周期需要程序员自己管理,偶尔使用;
2.GCD c语言实现 ,线程的生命周期自动管理 , 经常使用, 充分利用系统的多核;
3.NSOperation oc语言实现,线程的生命周期自动管理, 经常使用, 基于GCD,但增加了更加实用的功能,更面向对象;
今天主要总结一下NSThread相关的内容。一、NSThread 创建方式:
#pragma mark 第一种创建方式 /* NSThread 创建方式 1> NSThread先创建 2> start 启动线程 */ -(void)createThread1{ //1.创建线程对象,每一个NSThread都是一个线程。 NSThread *thread=[[NSThread alloc] initWithTarget:self selector:@selector(doSomeThing:) object:@"欢迎关注微信公众账号:乐Coding"]; // [NSThread setThreadPriority:0.7]; //2. 设置线程的优先级,取值范围是0.0 ~1.0 ,默认是0.5。值越大优先级越高。 NSThread *thread2=[[NSThread alloc] initWithTarget:self selector:@selector(doSomeThing:) object:@"欢迎关注微信公众账号:lecoding"]; thread2.name=@"线程B"; //3.给线程起名字 [thread start]; [thread2 start]; } #pragma mark 第二种创建方式 /* NSThread 创建方式, 类创建方式 创建线程后自动启动 */ -(void)createThread2{ //创建线程后自动启动 [NSThread detachNewThreadSelector:@selector(doSomeThing:) toTarget:self withObject:@"欢迎关注微信公众账号:lecoding"]; } #pragma mark 第三种创建方式 /* 隐式创建线程,并且直接启动 每个NSObject 都有该方法 */ -(void)createThread3{ //在后台线程即子线程中执行。 [self performSelectorInBackground:@selector(doSomeThing:) withObject:@"欢迎关注微信公众账号:lecoding"]; } #pragma mark 任务 -(void)doSomeThing:(NSString *)param{ for (int i=0; i<1000; i++) { NSLog(@"%@ :run--> %@ , %i",[NSThread currentThread],param,i); } }
二、线程同步(互斥锁)
资源共享
1块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源
比如多个线程访问同一个对象、同一个变量、同一个文件
当多个线程访问同一块资源时,很容易引发数据错乱和数据安全问题
因为多线程存在安全隐患所以需要使用加锁的方式解决
添加锁的方式使用:
@synchronized(self){ //加锁,只能用同一个锁 //要锁住的代码 } //解锁
互斥锁的优缺点
优点:能有效防止因多线程抢夺资源造成的数据安全问题
缺点:需要消耗大量的CPU资源
互斥锁的使用前提:多条线程抢夺同一块资源
相关专业术语:线程同步
线程同步的意思是:多条线程按顺序地执行任务
互斥锁,就是使用了线程同步技术
三、线程间通信常用方法
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait; - (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait;