美文网首页
iOS多线程之NSThread详解

iOS多线程之NSThread详解

作者: 明似水 | 来源:发表于2020-02-26 10:21 被阅读0次

    NSThread简介

    NSThread是苹果官方提供面向对象操作线程的技术,使用方便,可以直接操作线程对象,但是需要控制线程的生命周期。
    

    一、属性

    //当前线程
    @property (class, readonly, strong) NSThread *currentThread;
    /**
    每个线程都维护了一个键-值的字典,它可以在线程里面的任何地方被访问。
    你可以使用该字典来保存一些信息,这些信息在整个线程的执行过程中都保持不变。
    比如,你可以使用它来存储在你的整个线程过程中 Run loop 里面多次迭代的状态信息。
    NSThread实例可以使用一下方法
    */
    @property (readonly, retain) NSMutableDictionary *threadDictionary;
    NSMutableDictionary *dict = [thread threadDictionary]; 
    
    //优先级
    @property double threadPriority ;
    
    /** NSQualityOfService:
      NSQualityOfServiceUserInteractive:最高优先级,主要用于提供交互UI的操作,比如处理点击事件,绘制图像到屏幕上
      NSQualityOfServiceUserInitiated:次高优先级,主要用于执行需要立即返回的任务
      NSQualityOfServiceDefault:默认优先级,当没有设置优先级的时候,线程默认优先级
      NSQualityOfServiceUtility:普通优先级,主要用于不需要立即返回的任务
      NSQualityOfServiceBackground:后台优先级,用于完全不紧急的任务
    */
    @property NSQualityOfService qualityOfService;
    
    //线程名称
    @property (nullable, copy) NSString *name;
    
    //线程使用栈区大小,默认是512K
    @property NSUInteger stackSize ;
    
    //线程是否在执行
    @property (readonly, getter=isExecuting) BOOL executing;
    
    //线程是否执行结束
    @property (readonly, getter=isFinished) BOOL finished;
    
    //线程是否取消
    @property (readonly, getter=isCancelled) BOOL cancelled;
    

    二、实例方法

    //启动线程
    -(void)start;
    
    //是否为主线程
    -(BOOL)isMainThread;
    
    //设置线程名称
    -(void)setName:(NSString *)n;
    
    //取消线程
    -(void)cancel ;
    
    //线程的入口函数
    -(void)main ;
    
    //判断线程是否正在执行
    -(void)isExecuting;
    
    //判断线程是否已经完成
    -(void)isFinished;
    
    //判断线程是否取消
    -(void)isCancelled; 
    

    三、类方法

    /**
      block方式
    */
    + (void)detachNewThreadWithBlock:(void (^)(void))block;
    /**
      SEL方式
    */
    + (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(nullable id)argument;
    
    //获取当前线程
    +(void)currentThread;
    
    //当前代码运行所在线程是否是子线程
    +(BOOL)isMultiThreaded;
    
    //当前代码所在线程睡到指定时间
    +(void)sleepUntilDate:(NSDate *)date;
    
    //当前线程睡多长时间
    +(void)sleepForTimeInterval:(NSTimeInterval)ti; 
    
    //退出当前线程
    +(void)exit;
    
    //设置当前线程优先级
    +(double)threadPriority;
    
    //给当前线程设定优先级,调度优先级的取值范围是0.0 ~ 1.0,默认0.5,值越大,优先级越高。
    +(BOOL)setThreadPriority:(double)p;
    
    //线程的调用都会有函数的调用函数的调用就会有栈返回地址的记录,在这里返回的是函 数调用返回的虚拟地址,说白了就是在该线程中函数调用的虚拟地址的数组
    +(NSArray *)callStackReturnAddresses;
    
    //同上面的方法一样,只不过返回的是该线程调用函数的名字数字
    +(NSArray *)callStackSymbols;
    

    四、卖火车票&线程加锁

    self.tickets = 20;
        NSThread *t1 = [[NSThread alloc]initWithTarget:self selector:@selector(saleTickets) object:nil];
        t1.name = @"售票员A";
        [t1 start];
        
        NSThread *t2 = [[NSThread alloc]initWithTarget:self selector:@selector(saleTickets) object:nil];
        t2.name = @"售票员B";
        [t2 start];
    

    然后:将售票的方法加锁

    - (void)saleTickets{
        while (YES) {
            [NSThread sleepForTimeInterval:1.0];
            //互斥锁 -- 保证锁内的代码在同一时间内只有一个线程在执行
            @synchronized (self){
                //1.判断是否有票
                if (self.tickets > 0) {
                    //2.如果有就卖一张
                    self.tickets --;
                    NSLog(@"还剩%d张票  %@",self.tickets,[NSThread currentThread]);
                }else{
                    //3.没有票了提示
                    NSLog(@"卖完了 %@",[NSThread currentThread]);
                    break;
                }
            }
        }
    
    }
    

    END.

    相关文章

      网友评论

          本文标题:iOS多线程之NSThread详解

          本文链接:https://www.haomeiwen.com/subject/cjnpchtx.html