iOS线程之NSThread

来源:互联网 发布:python 字符串变json 编辑:程序博客网 时间:2024/06/05 20:58

NSThread

一、创建方法

  • 使用initWithTarget方法,有返回值

    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run:) object:@"jack"];
  • 使用detachNewThreadSelector方法,没有返回值

    [NSThread detachNewThreadSelector:@selector(run:) toTarget:self withObject:@"rose"];
  • 使用performSelectorInBackground方法,没有返回值

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

二、常用方法

  • 获得主线程

    + (NSThread *)mainThread; 
  • 是否为主线程

    - (BOOL)isMainThread;+ (BOOL)isMainThread;       
  • 获得当前线程

    NSThread *current = [NSThread currentThread];

三、线程的状态

线程的状态图

状态图

控制线程状态的方法

  • 启动线程

    - (void)start; 
  • 阻塞线程

    + (void)sleepUntilDate:(NSDate *)date;+ (void)sleepForTimeInterval:(NSTimeInterval)ti;
  • 强制停止线程

    + (void)exit;

四、多线程安全的安全隐患

出现的问题

当多个线程同时访问同一个资源的时候,很容易引发数据错乱和数据安全的问题,如买票,取钱等问题

解决方法–互斥锁

  • 互斥锁使用格式
    • @synchronized(锁对象) { // 需要锁定的代码 }
    • 锁对象必须是同一对象,并且锁定1份代码只用1把锁,多把锁是无效的
  • 互斥锁的优缺点
    • 优点:能有效防止多线程强占同一资源造成的安全问题
    • 缺点:需要消耗大量CPU资源
  • 互斥锁的使用前提
    • 多个线程使用同一资源

原子属性,非原子属性

  • OC在定义属性时有nonatomic和atomic两种选择
    • atomic:原子属性,为setter方法加锁(默认就是atomic)
    • nonatomic:非原子属性,不会为setter方法加锁

五、线程间的通信

简介

  • 在一个进程中,线程往往不是独立存在的,多个线程之间需要经常通信
  • 线程的通信体现在
    • 1个线程传递数据给另1个线程
    • 在1个线程中执行完特定任务后,转到另1个线程继续执行任务

常用方法

- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait;
0 0