當前位置:
首頁 > 知識 > 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

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 科技優家 的精彩文章:

Android hook神器frida(一)
同一個tomcat多個項目共享session,一個tomcat兩個項目共享sessionId
ELK日誌框架(2):log4net.ElasticSearch+ Kibana實現日誌記錄和顯示
React Native之APK文件簽名及打包

TAG:科技優家 |

您可能感興趣

Discuz API JSON 適用於IOS及Android移動端開發
Section 10-Halcon實戰寶典之HALCON概述與開發流程
Android Things OS 開發者預覽版8發布!
Made in Space為NASA開發可在太空混合3D列印系統
Square Enix正開發新動作RPG:登陸PS4及Switch
ESP32 開發板正式通過 Amazon FreeRTOS 的驗證
谷歌開發新系統Fuchsia 計劃取代Android和Chrome OS
「深入探討Xbox One X優化」Ninja Theory談《地獄之刃:塞娜的獻祭》4K HDR開發
WayRay舉辦「True SDK Challenge」大賽,重金招募AR開發者
Neurala與CSDN宣布戰略合作,將一站式AI平台BrainBuilder帶給中國開發者
BCH新開發者平台Developer.bitcoin上線,加速BCH應用開發
NET Core開發日誌——WCF Client
iOS 12 beta 5 開發者測試版暗示「iPhone X Plus」將有 iPad 的橫屏模式
Mixed Reality Toolkit-Unity開發系列—Sharing模塊
NI FlexRIO 使用Kintex UltraScale FPGA和夾層I/O模塊,滿足客戶定製前端開發
初探Burp Suite API 開發
Pokémon GO開發商將收購AR公司Escher
谷歌發布APP開發者平台Flutter beta 支持安卓和iOS
SE正開發面向Switch和PS4的ARPG
Windows 10內測版新API介面暗示Surface Phone仍在開發