iOS多线程之NSThread

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]; } } }}
 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值