iOS多线程之NSThread

NSThread

1、概念

1>一个NSThread对象就代表一条线程

2>创建和启动线程


NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];

[thread start];


+ (NSThread *)mainThread; // 获得主线程

- (BOOL)isMainThread; // 是否为主线程

+ (BOOL)isMainThread; // 是否为主线程


3>主要属性

name:线程的名字

number:私有属性,程序员不能访问,不会有提示,number = 1为主线程,number != 1为子线程,只能看不能改

threadPriority:优先级,double类型的变量,取值范围在0.01.0之间,默认0.5,值越大优先级越高

4>常用NSThread相关方法

a.类方法可以指定selector方法在后台线程执行,方法会直接调度

[NSThread detachNewThreadSelector:@selector(longOperation) toTarget:self withObject:nil];

b.一个隐式的多线程方法,直接会把selector的方法放在后台线程执行

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

5>老刘注意

多线程启动之后,任务的具体调度是由CPU决定的,程序员没有办法参与!

 

 在开发多线程的时候,永远不要相信一次运行的效果!

 

 关于优先级,只是表示CPU调度该任务会更积极一些,并不是优先级低的就不管了!

 

 老刘个人建议:通常开发的时候,不要处理优先级!"优先级反转"

 

 多线程的目的:把耗时操作放在后台执行!多线程开发要尽量简单!

6>线程状态

a.启动线程

- (void)start;  //这里的start只是进入到就绪状态,放入队列而已,只是说可以执行了,真正的执行时机是CPU给的,程序员不可控的

b.阻塞(暂停)线程

+ (void)sleepUntilDate:(NSDate *)date;

+ (void)sleepForTimeInterval:(NSTimeInterval *)ti;

c.强行停止线程

+ (void)exit;    

//手动强行退出进程,非正常死亡

//线程执行完毕会自动进入自然死亡停止状态,不能在开启任务

2、线程安全(互斥锁)

1>互斥锁使用格式

@sychronized(锁对象)

{

//需要锁住的内容,锁一个内容,只需要一把锁,用多把锁是无效的

}

注意:锁对象的选择,不能是局部对象,局部的对象除了作用域,锁都没有了,锁个毛。通常使用self

2>缺点

消耗CPU资源太大,基本不用

3、原子锁

 一旦定义了原子属性,不要重写getter&setter方法

 原子锁本质上是128位自旋锁,能够实现单写多读,保证只有一个线程写入,但是允许多个线程读取

 提示:只要有额外的代码,需要CPU付出额外的代价,原子属性同样代价很高!性能不好,费电!

 一般开发不建议使用任何锁!

4、在UIKit(基础UI框架)中几乎所有的对象都是线程不安全的,但是苹果约定所有的UI控件的更新,都必须在主线程执行

5、NSThread创建的线程,不会自动使用@autoreleasepool,所以如果使用到NSThread的所线程技术时,如果涉及分配内存,需要手动添加@autoreleasepool(当然NSObject的隐式的多线程技术是来源自NSThread同样需要@autoreleasepool)

6、线程间通信常用方法

- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;

- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait;



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值