天天看點

多線程NSThread

建立和啟動線程

  • 一個NSThread對象就代表一條線程
  • 建立、啟動線程
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
[thread start];
// 線程一啟動,就會線上程thread中執行self的run方法
           
  • 主線程相關用法
+ (NSThread *)mainThread; // 獲得主線程
- (BOOL)isMainThread; // 是否為主線程
+ (BOOL)isMainThread; // 是否為主線程
           

其他用法

  • 獲得目前線程
NSThread *current = [NSThread currentThread];
           
  • 線程的排程優先級
+ (double)threadPriority;
+ (BOOL)setThreadPriority:(double)p;
- (double)threadPriority;
- (BOOL)setThreadPriority:(double)p;
//排程優先級的取值範圍是0.0 ~ 1.0,預設0.5,值越大,優先級越高
           
  • 線程的名字
- (void)setName:(NSString *)n;
- (NSString *)name;
           

其他建立線程方式

  • 建立線程後自動啟動線程
[NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];
           
  • 隐式建立并啟動線程
[self performSelectorInBackground:@selector(run) withObject:nil];
           
  • 上述2種建立線程方式的優缺點
    • 優點:簡單快捷
    • 缺點:無法對線程進行更詳細的設定

線程的狀态

多線程NSThread

控制線程狀态

  • 啟動線程
- (void)start; 
// 進入就緒狀态 -> 運作狀态。當線程任務執行完畢,自動進入死亡狀态
           
  • 阻塞(暫停)線程
+ (void)sleepUntilDate:(NSDate *)date;
+ (void)sleepForTimeInterval:(NSTimeInterval)ti;
// 進入阻塞狀态
           
  • 強制停止線程
+ (void)exit;
// 進入死亡狀态
           

注意:一旦線程停止(死亡)了,就不能再次開啟任務

多線程的安全隐患

  • 資源共享
    • 1塊資源可能會被多個線程共享,也就是多個線程可能會通路同一塊資源
    • 比如多個線程通路同一個對象、同一個變量、同一個檔案
  • 當多個線程通路同一塊資源時,很容易引發資料錯亂和資料安全問題

繼續閱讀