iOS多線程開發之NSThread,ios多線程nsthread
一、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