一個NSThread對象就表明一條線程app
建立、啓動線程函數
(1) NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];spa
[thread start];線程
// 線程一啓動,就會在線程thread中執行self的run方法code
主線程相關用法orm
+ (NSThread *)mainThread; // 得到主線程對象
- (BOOL)isMainThread; // 是否爲主線程blog
+ (BOOL)isMainThread; // 是否爲主線程事件
其餘用法get
得到當前線程
NSThread *current = [NSThread currentThread];
線程的調度優先級:調度優先級的取值範圍是0.0 ~ 1.0,默認0.5,值越大,優先級越高
+ (double)threadPriority;
+ (BOOL)setThreadPriority:(double)p;
設置線程的名字
- (void)setName:(NSString *)n;
- (NSString *)name;
其餘建立線程的方式
(2)建立線程後自動啓動線程 [NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];
(3)隱式建立並啓動線程 [self performSelectorInBackground:@selector(run) withObject:nil];
上述2種建立線程方式的優缺點
優勢:簡單快捷
缺點:沒法對線程進行更詳細的設置
2、代碼示例
1.使用古老的方式建立
1 // 2 // YYViewController.m 3 // 4 // 5 // Created by apple on 14-6-23. 6 // Copyright (c) 2014年 itcase. All rights reserved. 7 // 8 9 10 #import "YYViewController.h" 11 #import <pthread.h> 12 13 14 @interface YYViewController () 15 - (IBAction)btnClick; 16 @end 17 18 19 @implementation YYViewController 20 21 22 - (void)viewDidLoad 23 { 24 [super viewDidLoad]; 25 } 26 27 28 //按鈕的點擊事件 29 - (IBAction)btnClick { 30 //1.獲取當前線程 31 NSThread *current=[NSThread currentThread]; 32 //主線程 33 NSLog(@"btnClick----%@",current); 34 35 //2.使用for循環執行一些耗時操做 36 pthread_t thread; 37 pthread_create(&thread, NULL, run, NULL); 38 } 39 40 41 //c語言函數 42 void *run(void *data) 43 { 44 //獲取當前線程,是新建立出來的線程 45 NSThread *current=[NSThread currentThread]; 46 47 48 for (int i=0; i<10000; i++) { 49 NSLog(@"btnClick---%d---%@",i,current); 50 } 51 return NULL; 52 } 53 54 //多個線程,點擊按鈕執行按鈕調用方法的時候,主線程沒有被阻塞 55 56 @end 57 58
實現效果:
打印結果:
2.使用NSThread建立線程
1 // 2 // YYViewController.m 3 // 4 // 5 // Created by apple on 14-6-23. 6 // Copyright (c) 2014年 itcase. All rights reserved. 7 // 8 9 #import "YYViewController.h" 10 #import <pthread.h> 11 12 13 @interface YYViewController () 14 - (IBAction)btnClick; 15 @end 16 17 18 @implementation YYViewController 19 20 - (void)viewDidLoad 21 { 22 [super viewDidLoad]; 23 } 24 25 26 //按鈕的點擊事件 27 - (IBAction)btnClick { 28 //1.獲取當前線程 29 NSThread *current=[NSThread currentThread]; 30 //主線程 31 NSLog(@"btnClick----%@",current); 32 33 //獲取主線程的另一種方式 34 NSThread *main=[NSThread mainThread]; 35 NSLog(@"主線程-------%@",main); 36 37 //2.執行一些耗時操做 38 [self creatNSThread]; 39 // [self creatNSThread2]; 40 // [self creatNSThread3]; 41 } 42 43 44 /** 45 * NSThread建立線程方式1 46 * 1> 先建立初始化線程 47 * 2> start開啓線程 48 */ 49 -(void)creatNSThread 50 { 51 NSThread *thread=[[NSThread alloc]initWithTarget:self selector:@selector(run:) object:@"線程A"]; 52 //爲線程設置一個名稱 53 thread.name=@"線程A"; 54 //開啓線程 55 [thread start]; 56 57 58 NSThread *thread2=[[NSThread alloc]initWithTarget:self selector:@selector(run:) object:@"線程B"]; 59 //爲線程設置一個名稱 60 thread2.name=@"線程B"; 61 //開啓線程 62 [thread2 start]; 63 } 64 65 66 /** 67 * NSThread建立線程方式2 68 *建立完線程直接(自動)啓動 69 */ 70 71 -(void)creatNSThread2 72 { 73 // NSThread *thread=[NSThread detachNewThreadSelector:@selector(run:) toTarget:self withObject:@"建立完線程直接(自動)啓動"]; 74 75 [NSThread detachNewThreadSelector:@selector(run:) toTarget:self withObject:@"建立完線程直接(自動)啓動"]; 76 } 77 78 79 /** 80 * NSThread建立線程方式3 81 * 隱式建立線程, 而且直接(自動)啓動 82 */ 83 84 -(void)creatNSThread3 85 { 86 //在後臺線程中執行===在子線程中執行 87 [self performSelectorInBackground:@selector(run:) withObject:@"隱式建立"]; 88 } 89 90 91 92 -(void)run:(NSString *)str 93 { 94 //獲取當前線程 95 NSThread *current=[NSThread currentThread]; 96 //打印輸出 97 for (int i=0; i<10; i++) { 98 NSLog(@"run---%@---%@",current,str); 99 } 100 } 101 @end
調用線程1,打印結果爲:
調用線程2
調用線程3