多线程(2)——NSThread

2015-09-21  本文已影响236人  AI码上编程

iOS中实现多线程的四种方案

Pthread:这种纯c语言的就别用了吧,还要自己管理线程的生命周期,果断不用
NSThread:这个虽然自己管理线程的生命周期,但这是面向对象的,OC语言,不常用到但要会用
GCD:这个很重要、很重要、很重要 自动管理线程的生命周期 使用率非常非常频繁
NSOpreation:这个也很重要,必须掌握,没什么好说的,也是自动管理线程的生命周期,使用率也非常高

简单了解下Pthread

只要create一次就会创建一个新的线程
系统会自动在子线程中调用传入的函数

  /*
第一个参数: 线程的代号(当做就是线程)
第二个参数: 线程的属性
第三个参数: 指向函数的指针, 就是将来线程需要执行的方法
第四个参数: 给第三个参数的指向函数的指针 传递的参数
一般情况下C语言中的类型都是以 _t或者Ref结尾
  */
pthread_t threadId;
// 只要create一次就会创建一个新的线程
pthread_create(&threadId , NULL, &demo, "hq");

关于NSThread

创建方法

** 第一种方法 ** (手动开启线程)

// 线程一启动,就会在线程thread中执行self的run方法

// 1.创建线程
NSThread *thread = [[NSThread alloc] initWithTarget:selfselector:@selector(run) object:nil];

// 2.设置线程的优先级(0.0 - 1.0,1.0最高级)  
thread.threadPriority = 1; 

// 3.启动线程
[thread start];

** 第二种方法 ** (自动开启线程)

// detachNewThreadSelector: 不用手动调用start方法, 系统会自动启动 没有返回值, 不能对线程进行更多的设置

[NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];

** 第三种方法 ** (隐式创建并启动线程)

// 系统就会自动创建一个子线程, 并且在子线程中自动执行self的@selector方法

[self performSelectorInBackground:@selector(run) withObject:nil];

NSThread用法

 + (NSThread *)mainThread; // 获得主线程
- (BOOL)isMainThread; // 是否为主线程
+ (BOOL)isMainThread; // 是否为主线程
NSThread *main = [NSThread mainThread];
NSThread *current = [NSThread currentThread];

线程的状态

启动线程
- (void)start; 
// 进入就绪状态 -> 运行状态。当线程任务执行完毕,自动进入死亡状态

阻塞(暂停)线程
// sleep方法是一个类方法, 所以说明在哪个线程中调用, 就会给哪个线程设置暂时
+ (void)sleepUntilDate:(NSDate *)date;
+ (void)sleepForTimeInterval:(NSTimeInterval)time;

// 暂停1s  
[NSThread sleepForTimeInterval:1]; 
[NSThread sleepUntilDate:[NSDate dateWithTimeInterval:1 sinceDate:[NSDate date]]];
强制停止线程
// 进入死亡状态
+ (void)exit;
注意:一旦线程停止(死亡)了,就不能再次开启任务

多线程的安全隐患及解决措施

// (锁对象self)
@synchronized
{ 
    // 需要锁定的代码      
}
        /*
         只要被@synchronized的{}包裹起来的代码, 同一时刻就只能被一个线程执行
         注意:
         1. 只要枷锁就会消耗性能
         2. 加锁必须传递一个对象, 作为锁
         3. 如果想真正的锁住代码, 那么多个线程必须使用同一把锁才行
         4. 加锁的时候尽量缩小范围, 因为范围越大性能就越低
         */

原子和非原子属性

注意点: atomic系统自动给我们添加的锁不是互斥锁/ 自旋锁

线程间的通信

[self performSelector:@selector(run) withObject:nil]; 
[self performSelector:@selector(run) onThread:thread withObject:nil waitUntilDone:YES];  

// waitUntilDone的含义: 如果传入的是YES: 那么会等到主线程中的方法执行完毕, 才会继续执行下面其他行的代码 如果传入的是NO: 那么不用等到主线程中的方法执行完毕, 就可以继续执行下面其它行的代码

线程间的通信最常见的就是在子线程中做耗时操作,然后回到主线程刷新UI

关于NSThread的总结

上一篇 下一篇

猜你喜欢

热点阅读