一、NSThread基本概念 NSThread是基於線程使用,輕量級的多線程編程方法(相對GCD和NSOperation),一個NSThread對象代表一個線程,需要手動管理線程的生命周期,處理線程同步等問題。 二、創建、啟動線程 1、動態實例化 - 先創建再人工啟動 2、靜態實例化 - 創建後自啟 ...
一、NSThread基本概念
NSThread是基於線程使用,輕量級的多線程編程方法(相對GCD和NSOperation),一個NSThread對象代表一個線程,需要手動管理線程的生命周期,處理線程同步等問題。
二、創建、啟動線程
1、動態實例化 - 先創建再人工啟動
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(loadingImage) object:nil]; // 線程啟動,線上程thread中執行self的loadingImage方法 [thread start];
2、靜態實例化 - 創建後自啟動
// 創建自啟動,執行loadingImage方法 [NSThread detachNewThreadSelector:@selector(loadingImage) toTarget:self withObject:nil];
3、隱式實例化 - 創建後自啟動
// 創建自啟動,執行loadingImage方法 [self performSelectorInBackground:@selector(loadingImage) withObject:nil];
三、線程式控制制
1、暫停
+ (void)sleepUntilDate:(NSDate *)date; + (void)sleepForTimeInterval:(NSTimeInterval)ti;
NSThread的暫停會阻塞當前線程
2、取消
- (void)cancel
NSThread的取消線程並不是馬上停止並退出線程,只作(線程是否需要退出)狀態標記
3、線程停止
+ (void)exit
NSThread的停止方法會立即終止除主線程以外所有線程(無論是否在執行任務)並退出,慎用! 否則可能會導致記憶體問題
四、NSThread的拓展認識
1、一些常用方法
// 獲得主線程 + (NSThread *)mainThread; // 判斷是否為主線程(對象方法) - (BOOL)isMainThread; // 判斷是否為主線程(類方法) + (BOOL)isMainThread; // 獲得當前線程 NSThread *current = [NSThread currentThread];
2、線程優先順序設置
//iOS8之前 [NSThread setThreadPriority:1.0]; // (0.0,-1.0,1.0) -----------------------------分割線------------------------------ //iOS8之後 [NSThread setQualityOfService:NSQualityOfServiceUserInitiated]; /* qualityOfService的枚舉值如下: NSQualityOfServiceUserInteractive:最高優先順序,用於用戶交互事件 NSQualityOfServiceUserInitiated:次高優先順序,用於用戶需要馬上執行的事件 NSQualityOfServiceDefault:預設優先順序,主線程和沒有設置優先順序的線程都預設為這個優先順序 NSQualityOfServiceUtility:普通優先順序,用於普通任務 NSQualityOfServiceBackground:最低優先順序,用於不重要的任務 */
3、線程間的通信
// 1、指定當前線程執行操作 [self performSelector:@selector(run)]; [self performSelector:@selector(run) withObject:nil]; [self performSelector:@selector(run) withObject:nil afterDelay:3.0f]; -----------------------------分割線------------------------------------------ // 2、指定在主線程執行操作(如更新UI) [self performSelectorOnMainThread:@selector(run) withObject:nil waitUntilDone:YES]; -----------------------------分割線------------------------------------------ // 3、指定在其他線程操作(主線程->新線程) // 這裡指定為某個線程newThread [self performSelector:@selector(run) onThread:newThread withObject:nil waitUntilDone:YES]; // 這裡指定為後臺線程 [self performSelectorInBackground:@selector(run) withObject:nil];
五、線程同步
多線程不可避免的會帶來不同線程併發執行時爭奪共用資源的問題(如記憶體,數據源等),這會造成數據的不一致(臟數據),甚至嚴重的引起死鎖。
線程同步是指是指在一定的時間內只允許某一個線程訪問某個資源,這就像是GCD里的柵欄(dispatch_barrier)或者信號量(dispatch_semphore)一樣。
目前iOS實現線程加鎖有NSLock和@synchronized兩種方式
關於線程鎖的更多相關知識,請參考文章:http://www.jianshu.com/p/35dd92bcfe8c