iOS多线程之:NSThread

线程的概念:线程,有时被称为轻量进程(Lightweight Process,LWP),是程序中一个单一的顺序控制流程。线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。

在单个程序中同时运行多个线程完成不同的工作,称为多线程。

在iOS开发中,实现多线程的机制常用的有三种:NSThread,GCD dispatch,NSOperation。当然还有底层的pthread。

今天,我们先来聊聊NSThread。

初始化NSThread
- (instancetype)initWithTarget:(id)target selector:(SEL)selector object:(nullable id)argument;
//iOS10新出的api
- (instancetype)initWithBlock:(void (^)(void))block;API_AVAILABLE(macosx(10.12), ios(10.0), watchos(3.0), tvos(10.0));

初始化之后的NSThread要调用start才能开启线程

- (void)start

除了对象初始化方法,苹果还提供了便利的类方法来开启线程:

//iOS10新出api
+ (void)detachNewThreadWithBlock:(void (^)(void))block API_AVAILABLE(macosx(10.12), ios(10.0), watchos(3.0), tvos(10.0));
+ (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(nullable id)argument;

用类方法调度的线程默认就开启,不用调用start方法来启动。

让线程睡一会:
+ (void)sleepUntilDate:(NSDate *)date;
+ (void)sleepForTimeInterval:(NSTimeInterval)ti;
退出线程
+ (void)exit;

退出线程后,后面的程序流就不会执行了。

- (void)threadRun:(NSString *)par {
    NSLog(@"start");
    [NSThread exit];
    NSLog(@"end");
}
//控制台只输出start,之后线程就退出了
2019-01-05 10:33:01.938485+0800 AnalyzeNSThread[2781:136475] start
取消线程
- (void)cancel;

注意:调用cancel后,并不是直接取消退出线程,而是把线程的isCancelled 标志位置位YES。要退出线程还需要我们自己的线程执行中判断isCancelled然后调用exit来退出线程。

设置线程的优先级
+ (double)threadPriority;
+ (BOOL)setThreadPriority:(double)p;

一般开发中很少会设置线程的优先级,因为有可能会影响到内核调度线程,造成线程执行的卡顿。

线程的属性
//字典,可以添加其他信息
@property (readonly, retain) NSMutableDictionary *threadDictionary;
//线程的优先级
@property double threadPriority

/**
枚举的方式设置线程的优先级
NSQualityOfServiceUserInteractive:最高优先级,主要用于提供交互UI的操作,比如处理点击事件,绘制图像到屏幕上
NSQualityOfServiceUserInitiated:次高优先级,主要用于执行需要立即返回的任务
NSQualityOfServiceDefault:默认优先级
NSQualityOfServiceUtility:普通优先级,主要用于不需要立即返回的任务
NSQualityOfServiceBackground:后台优先级,用于完全不紧急的任务,优先级最低
*/
@property NSQualityOfService qualityOfService

//线程调用栈函数的返回地址
@property (class, readonly, copy) NSArray<NSNumber *> *callStackReturnAddresses
//线程调用栈函数的名称
@property (class, readonly, copy) NSArray<NSString *> *callStackSymbols
//线程名称
@property (nullable, copy) NSString *name
//线程栈大小
@property NSUInteger stackSize

@property (readonly) BOOL isMainThread
@property (class, readonly) BOOL isMainThread
@property (class, readonly, strong) NSThread *mainThread

//线程是否执行中
@property (readonly, getter=isExecuting) BOOL executing
//线程是否结束
@property (readonly, getter=isFinished) BOOL finished
//线程是否取消
@property (readonly, getter=isCancelled) BOOL cancelled

猜你喜欢

转载自blog.csdn.net/weixin_34061042/article/details/87346866