iOS多线程之NSThread
一个NSThread对象就代表一条线程
1.
创建,启动线程
NSThread*thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
[thread start];
// 线程一启动,就会在线程thread中执行self的run方法
主线程相关用法
+ (NSThread *)mainThread; // 获得主线程
- (BOOL)isMainThread; // 是否为主线程
+ (BOOL)isMainThread; // 是否为主线程
2.NSThread基本属性
获得当前线程
NSThread *current = [NSThread currentThread];
线程的调度优先级
+ (double)threadPriority;
+ (BOOL)setThreadPriority:(double)p;
- (double)threadPriority;
- (BOOL)setThreadPriority:(double)p;
调度优先级的取值范围是0.0 ~ 1.0,默认0.5,值越大,优先级越高
线程的名字
- (void)setName:(NSString *)name;
- (NSString *)name;
3. NSThread 创建线程的其他方式
// 创建线程后自动启动线程
[NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];
// 隐式创建并启动线程
[self performSelectorInBackground:@selector(run) withObject:nil];
上述2种创建线程方式的优缺点
优点:简单快捷
缺点:无法对线程进行更详细的设置
4 . 线程的5种状态
NSThread*thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
[thread start];
n启动线程
- (void)start;
// 进入就绪状态 ->运行状态。当线程任务执行完毕,自动进入死亡状态
阻塞(暂停)线程
+ (void)sleepUntilDate:(NSDate*)date;
+ (void)sleepForTimeInterval:(NSTimeInterval)ti;
// 进入阻塞状态
强制停止线程
+ (void)exit;
// 进入死亡状态
注意:一旦线程停止(死亡)了,就不能再次开启任务
5.
n 互斥锁使用格式
@synchronized(锁对象) { // 需要锁定的代码 }
// 初始化锁
NSLock *lock = [[NSLock alloc] init];
// 加锁
[lock lock];
// 解锁
[lock unlock];
注意:锁定1份代码只用1把锁,用多把锁是无效的
互斥锁的优缺点
优点:能有效防止因多线程抢夺资源造成的数据安全问题
缺点:需要消耗大量的CPU资源
互斥锁的使用前提:多条线程抢夺同一块资源
相关专业术语:线程同步
线程同步的意思是:多条线程按顺序地执行任务
互斥锁,就是使用了线程同步技术
<span style="color:#24ab33;font: 14.0px Menlo; font-kerning: none; -webkit-text-stroke: 0px #24ab33">//5. </span><span style="color:#24ab33;font: 14.0px Arial; font-kerning: none; -webkit-text-stroke: 0px #24ab33">线程间通信</span>
<span style="color:#24ab33;font: 14.0px Menlo; font-kerning: none; -webkit-text-stroke: 0px #24ab33"> <span> </span></span>
<span style="color:#24ab33;font: 14.0px Menlo; font-kerning: none; -webkit-text-stroke: 0px #24ab33"> </span><span style="color:#24ab33;font: 14.0px Arial; font-kerning: none; -webkit-text-stroke: 0px #24ab33">什么叫做线程间通信</span>
<span style="color:#24ab33;font: 14.0px Menlo; font-kerning: none; -webkit-text-stroke: 0px #24ab33"> </span><span style="color:#24ab33;font: 14.0px Arial; font-kerning: none; -webkit-text-stroke: 0px #24ab33">在</span><span style="color:#24ab33;font: 14.0px Menlo; font-kerning: none; -webkit-text-stroke: 0px #24ab33">1</span><span style="color:#24ab33;font: 14.0px Arial; font-kerning: none; -webkit-text-stroke: 0px #24ab33">个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信</span>
<span style="color:#24ab33;font: 14.0px Menlo; font-kerning: none; -webkit-text-stroke: 0px #24ab33"></span>
<span style="color:#24ab33;font: 14.0px Menlo; font-kerning: none; -webkit-text-stroke: 0px #24ab33"> </span><span style="color:#24ab33;font: 14.0px Arial; font-kerning: none; -webkit-text-stroke: 0px #24ab33">线程间通信的体现</span>
<span style="color:#24ab33;font: 14.0px Menlo; font-kerning: none; -webkit-text-stroke: 0px #24ab33"> 1</span><span style="color:#24ab33;font: 14.0px Arial; font-kerning: none; -webkit-text-stroke: 0px #24ab33">个线程传递数据给另</span><span style="color:#24ab33;font: 14.0px Menlo; font-kerning: none; -webkit-text-stroke: 0px #24ab33">1</span><span style="color:#24ab33;font: 14.0px Arial; font-kerning: none; -webkit-text-stroke: 0px #24ab33">个线程</span>
<span style="color:#24ab33;font: 14.0px Menlo; font-kerning: none; -webkit-text-stroke: 0px #24ab33"> </span><span style="color:#24ab33;font: 14.0px Arial; font-kerning: none; -webkit-text-stroke: 0px #24ab33">在</span><span style="color:#24ab33;font: 14.0px Menlo; font-kerning: none; -webkit-text-stroke: 0px #24ab33">1</span><span style="color:#24ab33;font: 14.0px Arial; font-kerning: none; -webkit-text-stroke: 0px #24ab33">个线程中执行完特定任务后,转到另</span><span style="color:#24ab33;font: 14.0px Menlo; font-kerning: none; -webkit-text-stroke: 0px #24ab33">1</span><span style="color:#24ab33;font: 14.0px Arial; font-kerning: none; -webkit-text-stroke: 0px #24ab33">个线程继续执行任务</span>
<span style="color:#24ab33;font: 14.0px Menlo; font-kerning: none; -webkit-text-stroke: 0px #24ab33"> </span>
<span style="color:#24ab33;font: 14.0px Menlo; font-kerning: none; -webkit-text-stroke: 0px #24ab33"> </span><span style="color:#24ab33;font: 14.0px Arial; font-kerning: none; -webkit-text-stroke: 0px #24ab33">线程间通信常用方法</span>
<pre name="code" class="objc"> - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait;
实例1:- (IBAction)btn:(UIButton *)sender { // 获得当前线程 NSLog(@"btn = %@",[NSThread currentThread]); // 1.初始化方法创建线程 NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil]; // 1.2. 给线程取名字 thread.name = @"threadA"; // 1.3 开始线程 [thread start]; // 2. 类方法创建线程 [NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil]; // 3. 创建隐身线程 [self performSelectorInBackground:@selector(run) withObject:nil]; // 4. 主线程运行 [self run];}- (void)run{ for (int i= 0; i < 10000; i++) { NSLog(@"%@---> %i",[NSThread currentThread],i); }}// @synchronized 加锁测试代码 - (void)locktest{ //NSLock *lock = [[NSLock alloc] init]; while (1) { @synchronized(self){ if (count > 0) { //[NSThread sleepForTimeInterval:0.05]; NSLog(@"%d ----- %@",count,[NSThread currentThread]); count--; }else { [NSThread exit]; } } }}