iOS多線程之NSThread
最近有時間想把多線程相關的內容整理一下,因為以前學的不夠系統,有錯誤地方請指正。iOS中有關多線程的技術方案主要有3中方式:
1.NSThread oc語言實現,線程的生命周期需要程序員自己管理,偶爾使用;
2.GCD c語言實現 ,線程的生命周期自動管理 , 經常使用, 充分利用系統的多核;
3.NSOperation oc語言實現,線程的生命周期自動管理, 經常使用, 基于GCD,但增加了更加實用的功能,更面向對象;
今天主要總結一下NSThread相關的內容。一、NSThread 創建方式:
#pragma mark 第一種創建方式 /* NSThread 創建方式 1> NSThread先創建 2> start 啟動線程 */ -(void)createThread1{ //1.創建線程對象,每一個NSThread都是一個線程。 NSThread *thread=[[NSThread alloc] initWithTarget:self selector:@selector(doSomeThing:) object:@"歡迎關注微信公眾賬號:樂Coding"]; // [NSThread setThreadPriority:0.7]; //2. 設置線程的優先級,取值范圍是0.0 ~1.0 ,默認是0.5。值越大優先級越高。 NSThread *thread2=[[NSThread alloc] initWithTarget:self selector:@selector(doSomeThing:) object:@"歡迎關注微信公眾賬號:lecoding"]; thread2.name=@"線程B"; //3.給線程起名字 [thread start]; [thread2 start]; } #pragma mark 第二種創建方式 /* NSThread 創建方式, 類創建方式 創建線程后自動啟動 */ -(void)createThread2{ //創建線程后自動啟動 [NSThread detachNewThreadSelector:@selector(doSomeThing:) toTarget:self withObject:@"歡迎關注微信公眾賬號:lecoding"]; } #pragma mark 第三種創建方式 /* 隱式創建線程,并且直接啟動 每個NSObject 都有該方法 */ -(void)createThread3{ //在后臺線程即子線程中執行。 [self performSelectorInBackground:@selector(doSomeThing:) withObject:@"歡迎關注微信公眾賬號:lecoding"]; } #pragma mark 任務 -(void)doSomeThing:(NSString *)param{ for (int i=0; i<1000; i++) { NSLog(@"%@ :run--> %@ , %i",[NSThread currentThread],param,i); } }
二、線程同步(互斥鎖)
資源共享
1塊資源可能會被多個線程共享,也就是多個線程可能會訪問同一塊資源
比如多個線程訪問同一個對象、同一個變量、同一個文件
當多個線程訪問同一塊資源時,很容易引發數據錯亂和數據安全問題
因為多線程存在安全隱患所以需要使用加鎖的方式解決
添加鎖的方式使用:
@synchronized(self){ //加鎖,只能用同一個鎖 //要鎖住的代碼 } //解鎖
互斥鎖的優缺點
優點:能有效防止因多線程搶奪資源造成的數據安全問題
缺點:需要消耗大量的CPU資源
互斥鎖的使用前提:多條線程搶奪同一塊資源
相關專業術語:線程同步
線程同步的意思是:多條線程按順序地執行任務
互斥鎖,就是使用了線程同步技術
三、線程間通信常用方法
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait; - (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait;
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!