- 一個NSThread對象就代表一條線程
- 創(chuàng)建他爸、啟動線程
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object: nil];
[thread start];
線程一啟動瘤载,就會在線程 thread 中執(zhí)行 self 的 run 方法
- 主線程相關方法
+ (NSThread *)mainThread; // 獲取主線程
- (BOOL)isMainThread; // 是否為主線程
- 獲取當前線程
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)缺點:
1)優(yōu)點:簡單快捷
2)缺點:無法對線程進行更詳細的設置
- 線程的狀態(tài)
- 啟動線程
- (void)start; //進入就緒狀態(tài) -> 運行狀態(tài)担平。 當線程任務執(zhí)行完畢,自動進入死亡狀態(tài)裕照。
- 阻塞(暫停)線程
// 進入阻塞狀態(tài)
+ (void)sleepUntilDate:(NSDate *)date;
+ (void)sleepForTimeInterval:(NSTimeInterval)ti;
- 強制停止線程
+ (void)exit; // 進入死亡狀態(tài)
注意:一旦線程停止(死亡)了显晶,就不能再次開啟任務
多線程的安全隱患
- 資源共享
1塊資源可能被多個線程共享,也就是** 多個線程可能會訪問同一塊兒資源 ,比如多個線程訪問同一對象跃闹、同一變量嵌削、同一文件。
當多個線程訪問同一塊資源時望艺,很容易引發(fā)數(shù)據(jù)錯亂和數(shù)據(jù)安全問題**
安全隱患解決 - 互斥鎖
- 互斥鎖格式
@synchronized
(鎖對象) { // 需要鎖定的的代碼}
注意:鎖定1一份代碼只用1把鎖苛秕,用多把鎖是無效的
- 互斥鎖的優(yōu)缺點
1) 優(yōu)點:能有效的防止因多線程搶奪資源造成的數(shù)據(jù)安全問題
2) 缺點:需要消耗大量的CPU資源
互斥鎖的使用前提: 多條線程搶奪同一塊資源
相關專業(yè)術語: 線程同步
線程同步的意思是:多條線程在同一條線上執(zhí)行 (按順序地執(zhí)行任務),互斥鎖找默,就是使用了線程同步技術
- OC在定義屬性時有nonatomic和atomic兩種選擇
- atomic: 原子屬性,為 setter 方法加鎖 (默認是atomic)艇劫,線程安全,需要消耗大量的資源
- nonatomic: 非原子屬性惩激,不會為 setter 方法加鎖店煞,非線程安全,適合內(nèi)存小的移動設備
- iOS 開發(fā)建議
所有的屬性都聲明為 nonatomic ,盡量避免多線程搶奪同一塊資源风钻,盡量將加鎖顷蟀、資源搶奪的業(yè)務邏輯交給服務器端處理,減小移動客戶端的壓力