iOS多线程之NSThread

jopen 9年前

最近有时间想把多线程相关的内容整理一下,因为以前学的不够系统,有错误地方请指正。iOS中有关多线程的技术方案主要有3中方式:

1.NSThread      oc语言实现,线程的生命周期需要程序员自己管理,偶尔使用;

2.GCD     c语言实现 ,线程的生命周期自动管理 , 经常使用, 充分利用系统的多核;

3.NSOperation     oc语言实现,线程的生命周期自动管理, 经常使用, 基于GCD,但增加了更加实用的功能,更面向对象;

</div>

今天主要总结一下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;