iOS多线程之NSThread<一>

什么是线程?什么是进程?线程和进程什么关系?这不是我们这一章关心的重点,我在这里假设大家都知道线程是cpu调度的最小单位,进程是cpu资源分配的最小单位,一个进程可以有若干个线程,为什么会这样,这也不是我们的重点,我还是假设大家都知道了cpu效率太高,需要的资源准备太慢,如果等待就太浪费cpu,所以我们让cpu每隔一段时间(非常短)就去做别的事情,然后一直切换,这就是所谓的多线程。
iOS中多线程有几种?GCD、NSOperation这两种大家都是能脱口而出的,也是大家最常用的两种,对iOS稍微了解多点的都知道还有NSThread,这个就很少使用了,因为要手动管理生命周期,其实iOS还有一种多线程应用方式,就是Pthread,这个大家知道有这么个东西就好,去百度一下随便看看,内容正式开始

Pthread

直接百度就可以了,没什么好说的

POSIX线程(POSIX threads),简称Pthreads,是线程的POSIX标准。该标准定义了创建和操纵线程的一整套API。在类Unix操作系统(Unix、Linux、Mac OS X等)中,都使用Pthreads作为操作系统的线程。Windows操作系统也有其移植版pthreads-win32。

NSTread

并不常用,了解一下,看下里面方法的功能
初始化一个线程

//创建线程并绑定fun方法
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(fun) object:nil];

启动一个线程

//创建并启动线程,执行fun方法
[NSThread detachNewThreadSelector:@selector(fun) toTarget:self withObject:nil];
[thread start];//启动线程
//如果你子类化NSThread类,你可以重写main方法,并且实现它。如果你这样做,你就没有必要调用super。
你绝不能直接调用mian方法,你应该通过调用start方法启动你的线程。
如果直接调用好像是会在主线程执行selectior方法
[thread main];

停止一个线程

[NSThread sleepForTimeInterval:3];// 阻塞线程一定的时间
[NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:3.0]];//阻塞线程直到某个时间
[NSThread exit];//杀死当前线程
[thread cancel];//取消线程

线程的状态

@property (readonly, getter=isExecuting) BOOL executing;//线程的执行状态
@property (readonly, getter=isFinished) BOOL finished;//线程的完成状态
@property (readonly, getter=isCancelled) BOOL cancelled;//线程的取消状态

活动在主线程

@property (readonly) BOOL isMainThread;//判断是否在主线程;
@property(class, readonly) BOOL isMainThread;//判断当前线程是否在主线程
@property(class, readonly, strong) NSThread *mainThread;//返回主线程

线程环境

+ (BOOL)isMultiThreaded;//当前程序是否是多线程的
@property(class, readonly, strong) NSThread *currentThread;//返回当前所在线程
//返回现场调用的地址数组
@property(class, readonly, copy) NSArray<NSNumber *> *callStackReturnAddresses;
+ (NSArray *)callStackSymbolsNS_AVAILABLE(10_6,4_0);  //返回现场调用的名字数组

线程属性

@property(readonly, retain) NSMutableDictionary *threadDictionary;//存储数据的字典
@property(copy) NSString *name;//线程的名字
@property NSUInteger stackSize;//存储空间大小

线程优先级

+ (double)threadPriority;//返回当前线程优先级
@property double threadPriority;//设置或者获取当前线程优先级
+ (BOOL)setThreadPriority:(double)p;//设置当前线程优先级

下面还有几个通知就不写了,看名字就知道什么意思.
还有一些object基于NSTread实现的方法

@interface NSObject (NSThreadPerformAdditions)

@interface NSObject (NSThreadPerformAdditions)

- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(nullable id)arg waitUntilDone:(BOOL)wait modes:(nullable NSArray<NSString *> *)array;
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(nullable id)arg waitUntilDone:(BOOL)wait;
    // equivalent to the first method with kCFRunLoopCommonModes

- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(nullable id)arg waitUntilDone:(BOOL)wait modes:(nullable NSArray<NSString *> *)array NS_AVAILABLE(10_5, 2_0);
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(nullable id)arg waitUntilDone:(BOOL)wait NS_AVAILABLE(10_5, 2_0);
    // equivalent to the first method with kCFRunLoopCommonModes
- (void)performSelectorInBackground:(SEL)aSelector withObject:(nullable id)arg NS_AVAILABLE(10_5, 2_0);

还有一些新加入的方法

- (instancetype)initWithBlock:(void (^)(void))block;//初始化一个带有block的线程
+ (void)detachNewThreadWithBlock:(void (^)(void))block;//创建一个带有block的线程并立即执行
系统要求 
iOS 10.0+
macOS 10.12+
tvOS 10.0+
watchOS 3.0+

还有一个系统优先级的方法,是一个枚举类型

//可读写属性,但是在线程开始之后就变成只读属性
@property NSQualityOfService qualityOfService;
typedef NS_ENUM(NSInteger, NSQualityOfService) {
    NSQualityOfServiceUserInteractive = 0x21,
    NSQualityOfServiceUserInitated = 0x19,
    NSQualityOfServiceUtility = 0x11,
    NSQualityOfServiceBackground = 0x09,
    NSQualityOfServiceDefault = -1
} NS_ENUM_AVAILABLE(10_10, 8_0);
系统要求
iOS 8.0+
macOS 10.10+
tvOS 8.0+
watchOS 2.0+
  • UserInteractive:UserInteractive 用于直接参与提供一个交互式UI,如处理事件或对屏幕的绘制。
  • UserInitiated:UserInitiated 用于表示执行工作已经被用户显示提出并且要求结果能够立即展示以便进行进一步的用户交互。比如:用户在信息列表点击之后立即加载一个email。
  • Utility:Utility 用于表述执行一项工作后,用户并不需要立即得到结果。这一工作通常用户已经请求过或者在初始化的时候已经自动执行,不会阻碍用户用户的进一步交互,通常在用户可见的时间尺度和可能由一个非模态的进度指示器展示给用户。
  • Background:Background 用于那些非用户初始化或可见的工作。通常说来,用户甚至不知道这想工作已经发生,但是它会以最有效的方法运行,用于完全不紧急的任务。例如:内容抓取,搜索索引,备份,同步与外部系统的数据。
  • Default:默认的优先级。尽可能的从其它资源推断可能的优先级信息。如果这一推断不成立,一个位于UserInitiated和Utility之间的优先级将得以使用。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容