- 一個NSThread對象就代表一條線程
- 創(chuàng)建、啟動線程
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object: nil];
[thread start];
線程一啟動,就會在線程 thread 中執(zhí)行 self 的 run 方法
- 主線程相關(guān)方法
+ (NSThread *)mainThread; // 獲取主線程
- (BOOL)isMainThread; // 是否為主線程
- 獲取當(dāng)前線程
NSThread *thread = [NSThread currentThread];
- 線程的名字
- (void)setName:(NSString *)name;
- (NSString *)name;
- 創(chuàng)建線程后自動啟動線程
+ (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(nullable id)argument;
*隱式創(chuàng)建并啟動線程
- (void)performSelectorInBackground:(SEL)aSelector withObject:(nullable id)arg;
*上述2中創(chuàng)建線程方式的優(yōu)缺點(diǎn):
1)優(yōu)點(diǎn):簡單快捷
2)缺點(diǎn):無法對線程進(jìn)行更詳細(xì)的設(shè)置
- 線程的狀態(tài)

- 啟動線程
- (void)start; //進(jìn)入就緒狀態(tài) -> 運(yùn)行狀態(tài)。 當(dāng)線程任務(wù)執(zhí)行完畢,自動進(jìn)入死亡狀態(tài)。
- 阻塞(暫停)線程
// 進(jìn)入阻塞狀態(tài)
+ (void)sleepUntilDate:(NSDate *)date;
+ (void)sleepForTimeInterval:(NSTimeInterval)ti;
- 強(qiáng)制停止線程
+ (void)exit; // 進(jìn)入死亡狀態(tài)
注意:一旦線程停止(死亡)了,就不能再次開啟任務(wù)
多線程的安全隱患
- 資源共享
1塊資源可能被多個線程共享,也就是** 多個線程可能會訪問同一塊兒資源 ,比如多個線程訪問同一對象、同一變量、同一文件。
當(dāng)多個線程訪問同一塊資源時,很容易引發(fā)數(shù)據(jù)錯亂和數(shù)據(jù)安全問題**
安全隱患解決 - 互斥鎖
- 互斥鎖格式
@synchronized(鎖對象) { // 需要鎖定的的代碼}
注意:鎖定1一份代碼只用1把鎖,用多把鎖是無效的
- 互斥鎖的優(yōu)缺點(diǎn)
1) 優(yōu)點(diǎn):能有效的防止因多線程搶奪資源造成的數(shù)據(jù)安全問題
2) 缺點(diǎn):需要消耗大量的CPU資源
互斥鎖的使用前提: 多條線程搶奪同一塊資源
相關(guān)專業(yè)術(shù)語: 線程同步
線程同步的意思是:多條線程在同一條線上執(zhí)行 (按順序地執(zhí)行任務(wù)),互斥鎖,就是使用了線程同步技術(shù)
- OC在定義屬性時有nonatomic和atomic兩種選擇
- atomic: 原子屬性,為 setter 方法加鎖 (默認(rèn)是atomic),線程安全,需要消耗大量的資源
- nonatomic: 非原子屬性,不會為 setter 方法加鎖,非線程安全,適合內(nèi)存小的移動設(shè)備
- iOS 開發(fā)建議
所有的屬性都聲明為 nonatomic ,盡量避免多線程搶奪同一塊資源,盡量將加鎖、資源搶奪的業(yè)務(wù)邏輯交給服務(wù)器端處理,減小移動客戶端的壓力