标签:
NSThread
创建线程的几种方式
// 1.创建线程 NJThread *thread = [[NJThread alloc] initWithTarget:self selector:@selector(demo:) object:@"lnj"]; // 设置线程名称 [thread setName:@"xmg"]; // 设置线程的优先级 // 优先级仅仅说明被CPU调用的可能性更大 [thread setThreadPriority:1.0]; // 2.启动线程 [thread start];
+ (NSThread *)mainThread; // 获得主线程 - (BOOL)isMainThread; // 是否为主线程 //获得当前线程 NSThread *current = [NSThread currentThread]; //线程的名字 - (void)setName:(NSString *)n; - (NSString *)name;
// 1.创建线程
[NSThread detachNewThreadSelector:@selector(demo:) toTarget:self withObject:@"lnj"];
// 1.创建线程
// 注意: Swift中不能使用, 苹果认为这个方法不安全
[self performSelectorInBackground:@selector(demo:) withObject:@"lnj"];
启动线程 - (void)start; // 进入就绪状态 -> 运行状态。当线程任务执行完毕,自动进入死亡状态 阻塞(暂停)线程 + (void)sleepUntilDate:(NSDate *)date; + (void)sleepForTimeInterval:(NSTimeInterval)ti; // 进入阻塞状态 强制停止线程 + (void)exit; // 进入死亡状态
注意:一旦线程停止(死亡)了,就不能再次开启任务
多线程的安全隐患
线程锁
@synchronized(锁对象) { // 需要锁定的代码 }
互斥锁的优缺点 优点:能有效防止因多线程抢夺资源造成的数据安全问题 缺点:需要消耗大量的CPU资源
互斥锁注意点
原子和非原子属性
自旋锁 & 互斥锁
[self performSelectorInBackground:@selector(download) withObject:nil]; /* waitUntilDone是否等待被调用方法执行完成,有可能也会等待调用方法的执行完成! YES: 等待被调用线程执行完毕再执行后面的代码 NO : 不用等待被调用线程执行完毕就可以执行后面的代码 */ [self performSelectorOnMainThread:@selector(showImage:) withObject:[UIImage imageWithData:data] waitUntilDone:YES];
标签:
原文地址:http://www.cnblogs.com/Apolla/p/4737984.html