iOS多線程之NSThread

jopen 9年前發布 | 12K 次閱讀 NSThread iOS開發 移動開發

最近有時間想把多線程相關的內容整理一下,因為以前學的不夠系統,有錯誤地方請指正。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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!