NSThread

  • 一个NSThread对象就代表一条线程
  • 创建、启动线程
    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object: nil];
    [thread start];

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

  • 主线程相关方法
+ (NSThread *)mainThread; // 获取主线程
- (BOOL)isMainThread;     // 是否为主线程
  • 获取当前线程

NSThread *thread = [NSThread currentThread];

  • 线程的名字
- (void)setName:(NSString *)name;
- (NSString *)name;
  • 创建线程后自动启动线程
+ (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(nullable id)argument;

*隐式创建并启动线程

- (void)performSelectorInBackground:(SEL)aSelector withObject:(nullable id)arg;

*上述2中创建线程方式的优缺点:

1)优点:简单快捷
2)缺点:无法对线程进行更详细的设置

  • 线程的状态
NSThread_第1张图片
  • 启动线程
- (void)start; //进入就绪状态 -> 运行状态。 当线程任务执行完毕,自动进入死亡状态。
  • 阻塞(暂停)线程
// 进入阻塞状态
+ (void)sleepUntilDate:(NSDate *)date;
+ (void)sleepForTimeInterval:(NSTimeInterval)ti; 
  • 强制停止线程
+ (void)exit;  // 进入死亡状态

注意:一旦线程停止(死亡)了,就不能再次开启任务

多线程的安全隐患

  • 资源共享

1块资源可能被多个线程共享,也就是** 多个线程可能会访问同一块儿资源 ,比如多个线程访问同一对象、同一变量、同一文件。
当多个线程访问同一块资源时,很容易引发
数据错乱和数据安全问题**

安全隐患解决 - 互斥锁

  • 互斥锁格式

@synchronized(锁对象) { // 需要锁定的的代码}
注意:锁定1一份代码只用1把锁,用多把锁是无效的

  • 互斥锁的优缺点

1) 优点:能有效的防止因多线程抢夺资源造成的数据安全问题
2) 缺点:需要消耗大量的CPU资源

  • 互斥锁的使用前提: 多条线程抢夺同一块资源

  • 相关专业术语: 线程同步

线程同步的意思是:多条线程在同一条线上执行 (按顺序地执行任务),互斥锁,就是使用了线程同步技术

  • OC在定义属性时有nonatomicatomic两种选择
  1. atomic: 原子属性,为 setter 方法加锁 (默认是atomic),线程安全,需要消耗大量的资源
  2. nonatomic: 非原子属性,不会为 setter 方法加锁,非线程安全,适合内存小的移动设备
  • iOS 开发建议

所有的属性都声明为 nonatomic ,尽量避免多线程抢夺同一块资源,尽量将加锁、资源抢夺的业务逻辑交给服务器端处理,减小移动客户端的压力

你可能感兴趣的:(NSThread)