iOS多線程之二:NSThread的使用

NSThread
NSThread封裝性最差,最偏向于底層,主要基于thread使用,生命周期需要手動(dòng)管理,所以這套方案也是偶爾用用,比如 [NSThread currentThread],它可以獲取當(dāng)前線程類,你就可以知道當(dāng)前線程的各種屬性,用于調(diào)試十分方便。

一、線程創(chuàng)建

// 創(chuàng)建并自動(dòng)啟動(dòng)
[NSThread detachNewThreadSelector:@selector(threadAlloc:) toTarget:self withObject:nil];

// 先創(chuàng)建線程,再啟動(dòng)
NSThread *newThread = [[NSThread alloc] initWithTarget:self selector:@selector(run:) object:obj];
[newThread run];

// ios(10.0),線程的創(chuàng)建,線程創(chuàng)建后直接運(yùn)行
[NSThread detachNewThreadWithBlock:^{
   [do something];
}];

[NSThread detachNewThreadSelector:@selector(run:) toTarget:self withObject:obj];

Paste_Image.png

二、線程之間的通訊

// 在主線程中運(yùn)行方法,wait表示是否阻塞這個(gè)方法的調(diào)用,如果為YES則等待主線程中運(yùn)行方法結(jié)束,一般可用于在子線程中調(diào)用UI方法。
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(nullable id)arg waitUntilDone:(BOOL)wait modes:(nullable NSArray<NSString *> *)array;

// 隱含產(chǎn)生新線程
- (void)performSelectorInBackground:(SEL)aSelector withObject:(nullable id)arg;

// 在指定線程中執(zhí)行,但該線程必須具備run loop。
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(nullable id)arg waitUntilDone:(BOOL)wait modes:(nullable NSArray<NSString *> *)array;

三、NSThread的其它一些常用的方法

+ (NSThread *)currentThread;                     // 獲得當(dāng)前線程
+ (void)sleepForTimeInterval:(NSTimeInterval)ti; // 線程休眠
+ (NSThread *)mainThread;                        // 主線程,亦即UI線程了
+ (BOOL)isMainThread;                            // 判斷當(dāng)前線程是否是主線程
+ (BOOL)isMultiThreaded;                         // 判斷當(dāng)前線程是否是多線程
+ (void)sleepUntilDate:(NSDate *)date;           // 當(dāng)前線程休眠到指定日期
+ (void)exit;                                    // 強(qiáng)行退出當(dāng)前線程
+ (double)threadPriority;                        // 獲取當(dāng)前線程線程優(yōu)先級(jí)
+ (BOOL)setThreadPriority:(double)p;             // 給當(dāng)前線程設(shè)定優(yōu)先級(jí),調(diào)度優(yōu)先級(jí)的取值范圍是0.0 ~ 1.0,默認(rèn)0.5,值越大,優(yōu)先級(jí)越高。
+ (NSArray *)callStackReturnAddresses            // 線程的調(diào)用都會(huì)有函數(shù)的調(diào)用函數(shù)的調(diào)用就會(huì)有棧返回地址的記錄,在這里返回的是函 數(shù)調(diào)用返回的虛擬地址,說(shuō)白了就是在該線程中函數(shù)調(diào)用的虛擬地址的數(shù)組
+ (NSArray *)callStackSymbols                    // 同上面的方法一樣,只不過(guò)返回的是該線程調(diào)用函數(shù)的名字?jǐn)?shù)字
+ (BOOL)isMainThread;                            // 當(dāng)前線程是否主線程
- (BOOL)isMainThread; 
- (BOOL)isExecuting;                             // 線程是否正在運(yùn)行
- (BOOL)isFinished;                              // 線程是否已結(jié)束
- (void)cancel                                   // 終止線程循環(huán)
- (void)start                                    // 開(kāi)啟線程循環(huán)
- (void)isCancelled;                             //判斷線程是否撤銷
- (void)setName:(NSString *)n;                   //設(shè)置線程名稱
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容