iOS多线程之NSThread详解

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.

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、多线程基础 基本概念 进程进程是指在系统中正在运行的一个应用程序每个进程之间是独立的,每个进程均运行在其专用且...
    AlanGe阅读 563评论 0 0
  • NSThread简介 NSThread是苹果官方提供面向对象操作线程的技术,简单方便,可以直接操作线程对象,不过需...
    一个默默无闻的程序猿阅读 19,387评论 5 35
  • 1、简介:1.1 iOS有三种多线程编程的技术,分别是:1.、NSThread2、Cocoa NSOperatio...
    LuckTime阅读 1,377评论 0 1
  • 目录: (一)线程与进程之间的区别 (二)为什么需要学习多线程 (三)多线程任务执行方式 (四)多线程执行的...
    KingLionsFrank阅读 805评论 6 6
  • 南方,每年春节前大多老板要组织全厂职工会餐一次,这就是所谓的团年饭。 团年饭的确可以收拢人心,激发人们隐藏在内心深...
    逃跑的新郎阅读 436评论 0 1