1、屬性
// 獲取當(dāng)前線程的一些信息
@property (class, readonly, strong) NSThread *currentThread;
// 線程的一些本地屬性,可以使用setObject:forkey:來(lái)配置
@property (readonly, retain) NSMutableDictionary *threadDictionary;
// 線程優(yōu)先級(jí),最高為1.0(已廢棄,用qualityOfService)
@property double threadPriority;
// 線程優(yōu)先級(jí)
@property NSQualityOfService qualityOfService;
typedef NS_ENUM(NSInteger, NSQualityOfService) {
/// 與用戶交互有關(guān)的.高優(yōu)先級(jí),需要立即響應(yīng).
NSQualityOfServiceUserInteractive = 0x21,
/// 由用戶發(fā)起的需要立即得到結(jié)果的任務(wù),優(yōu)先級(jí)比NSQualityOfServiceUserInteractive低
NSQualityOfServiceUserInitiated = 0x19,
/// 不需要馬上返回結(jié)果的任務(wù),優(yōu)先級(jí)比NSQualityOfServiceUserInitiated低
NSQualityOfServiceUtility = 0x11,
/// 后臺(tái)任務(wù),可能是在后臺(tái)備份用戶數(shù)據(jù)什么的,優(yōu)先級(jí)比NSQualityOfServiceUtility低
NSQualityOfServiceBackground = 0x09,
/// 默認(rèn)優(yōu)先級(jí).比NSQualityOfServiceUserInitiated低比NSQualityOfServiceUtility高.
NSQualityOfServiceDefault = -1
} API_AVAILABLE(macos(10.10), ios(8.0), watchos(2.0), tvos(9.0));
// 返回在該線程中函數(shù)調(diào)用的地址的一個(gè)數(shù)組
@property (class, readonly, copy) NSArray<NSNumber *> *callStackReturnAddresses;
// 使用代碼的方式獲取調(diào)用棧
@property (class, readonly, copy) NSArray<NSString *> *callStackSymbols;
// 線程名,主線程名為main
@property (nullable, copy) NSString *name;
// 線程使用的棧大小,默認(rèn)512K,需要設(shè)置為4K的正整數(shù)倍,需要在start前設(shè)置,之后設(shè)置可以改變大小(表現(xiàn)為取值)但是不會(huì)影響棧區(qū)的真實(shí)頁(yè)數(shù)
@property NSUInteger stackSize;
// 是否是主線程 (類屬性,實(shí)例屬性)
@property (readonly) BOOL isMainThread;
@property (class, readonly) BOOL isMainThread;
// 是否是主線程
@property (class, readonly, strong) NSThread *mainThread;
// 線程是否正在執(zhí)行,執(zhí)行前和執(zhí)行完畢都會(huì)返回NO.
@property (readonly, getter=isExecuting) BOOL executing ;
// 線程是否完成
@property (readonly, getter=isFinished) BOOL finished;
// 線程是否取消,只有調(diào)用了- (void)cancell才會(huì)取消,如果線程執(zhí)行完畢再調(diào)用- (void)cancell也是會(huì)返回YES…
// 線程是否取消
@property (readonly, getter=isCancelled) BOOL cancelled ;
2、方法
// MAKR: 類方法
// 創(chuàng)建一個(gè)線程并且執(zhí)行
+ (void)detachNewThreadWithBlock:(void (^)(void))block;
+ (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(nullable id)argument;
// 當(dāng)前進(jìn)程里面是否有多個(gè)子線程)
+ (BOOL)isMultiThreaded;
// 當(dāng)前線程睡眠date
+ (void)sleepUntilDate:(NSDate *)date;
// 當(dāng)前線程睡眠ti(秒)
+ (void)sleepForTimeInterval:(NSTimeInterval)ti;
// 退出當(dāng)前線程
+ (void)exit;
// 獲取線程優(yōu)先級(jí)
+ (double)threadPriority;
// 設(shè)置線程優(yōu)先級(jí)
+ (BOOL)setThreadPriority:(double)p;
// MARK: 實(shí)例方法
// 下面這三個(gè)方法都需要調(diào)用`- (void)start`來(lái)開(kāi)啟線程
- (instancetype)init;
- (instancetype)initWithTarget:(id)target selector:(SEL)selector object:(nullable id)argument;
- (instancetype)initWithBlock:(void (^)(void))block;
// 取消線程
- (void)cancel;
// 開(kāi)啟線程
- (void)start;
// 當(dāng)子類化NSThread的時(shí)候可以通過(guò)重寫(xiě)該方法來(lái)改變?nèi)肟?- (void)main; // thread body method
// MARK: NSThreadPerformAdditions分類方法
// 調(diào)用主線程,傳入一個(gè)與主線程RunLoop循環(huán)執(zhí)行有關(guān)的數(shù)組
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait modes: (NSArray *)array;
// 調(diào)用主線程更新UI
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;
// 調(diào)用指定的線程,傳入一個(gè)與線程RunLoop循環(huán)執(zhí)行有關(guān)的數(shù)組
- (void)performSelector:(SEL)aSelector onThread:(NSThread *) thread withObject:(id)arg waitUntilDone:(BOOL)wait modes:(NSArray *)array;
// 調(diào)用指定的線程更新數(shù)據(jù)
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thread withObject:(id)arg waitUntilDone: (BOOL)wait;
// 在后臺(tái)調(diào)用線程
- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg;
3、通知
/// 將要變成多線程的通知
FOUNDATION_EXPORT NSNotificationName const NSWillBecomeMultiThreadedNotification;
/// 已經(jīng)變成單線程的通知
FOUNDATION_EXPORT NSNotificationName const NSDidBecomeSingleThreadedNotification;
/// 線程將要退出的通知
FOUNDATION_EXPORT NSNotificationName const NSThreadWillExitNotification;