转载

iOS多线程之NSThread

最近有时间想把多线程相关的内容整理一下,因为以前学的不够系统,有错误地方请指正。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;

喜欢我们的内容,关注官方微信公众账号:乐Coding。

正文到此结束
Loading...