iOS多線程系列(一)------NSThread

前言:iPhone 中的線程應用並非無節制的,官方給出的資料顯示iPhone OS下的主線程的堆棧大小是1M,第二個線程開始都是512KB。而且該值不能經過編譯器開關或線程API函數來更改。ios

實現ios多線程主要有3種方法:NSThread 、NSOperation 、GCD。編程

 

iOS支持多個層次的多線程編程,層次越高的抽象程度越高,使用也越方便,也是蘋果最推薦使用的方法。下面根據抽象層次從低到高依次列出iOS所支持的多線程編程方法:多線程

 

1.Thread :是三種方法裏面相對輕量級的,但須要管理線程的生命週期、同步、加鎖問題,這會致使必定的性能開銷函數

2.Cocoa Operations:是基於OC實現的,NSOperation以面向對象的方式封裝了須要執行的操做,沒必要關心線程管理、同步等問題。NSOperation是一個抽象基類,iOS提供了兩種默認實現:NSInvocationOperation和NSBlockOperation,固然也能夠自定義NSOperation性能

3.Grand Central Dispatch(簡稱GCD,iOS4纔開始支持):提供了一些新特性、運行庫來支持多核並行編程,它的關注點更高:如何在多個cpu上提高效率spa

 

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------線程

 

這篇文章主要介紹NSThread的使用code

1、建立orm

線程建立主要有3種方式:對象

 
  
- (id)init;    // designated initializer
- (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument; //target參數:selector消息發送的對象
 
 

固然,還有一種比較特殊,就是使用所謂的convenient method,這個方法能夠直接生成一個線程並啓動它,並且無需爲線程的清理負責。這個方法的接口是:

+ (void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument

 

還有個隱式建立線程的方法:

[self performSelectorInBackground:@selector(run) withObject:nil];  

 

前兩種方法建立後,須要本身手動啓動,啓動的方法是:

- (void)start;

 2、獲取當前線程和主線程

NSThread *current = [NSThread currentThread]; 
NSThread *main = [NSThread mainThread];  

 

3、暫停

// 暫停2s  
[NSThread sleepForTimeInterval:2];  
  
// 或者  
NSDate *date = [NSDate dateWithTimeInterval:2 sinceDate:[NSDate date]];  
[NSThread sleepUntilDate:date];  

 

4、線程間通訊

//在指定線程上執行操做
[self performSelector:@selector(run) onThread:thread withObject:nil waitUntilDone:YES];  

//在主線程上執行操做
[self performSelectorOnMainThread:@selector(run) withObject:nil waitUntilDone:YES];  

//在當前線程執行操做
[self performSelector:@selector(run) withObject:nil]; 

 

5、優缺點

1.優勢:NSThread比其餘兩種多線程方案較輕量級,更直觀地控制線程對象

2.缺點:須要本身管理線程的生命週期,線程同步。線程同步對數據的加鎖會有必定的系統開銷

相關文章
相關標籤/搜索