iOS多线程之NSThread
来源:互联网 发布:这个历史挺靠谱淘宝价 编辑:程序博客网 时间:2024/09/21 09:24
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.0到1.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;
- iOS多线程之NSThread
- ios多线程之NSThread
- iOS多线程之NSThread
- iOS多线程之NSThread
- iOS 多线程之NSThread
- IOS多线程之NSThread
- iOS --- 多线程之NSThread
- iOS多线程之NSThread
- iOS多线程之NSThread
- iOS多线程之NSThread
- iOS多线程之NSThread
- iOS-多线程之NSThread
- iOS多线程之NSThread
- IOS多线程开发之NSThread
- iOS多线程之Pthread/NSthread
- iOS多线程之Pthread/NSthread
- iOS多线程编程之NSThread
- iOS整理 -- 多线程之NSThread
- iOS沙盒目录解析
- Go by Example: If/Else
- 输入一段字符串和要判断的字母,然后判定该字母是否在字符串里面,给出相应的提示
- 7-06. 奥运排行榜(25)(数学 ZJU_PAT)
- 创造 和 奉献 的辩论关系
- iOS多线程之NSThread
- RMQ问题再临
- iOS多线程之GCD
- 13周(数组)
- UVA - 10913 Walking on a Grid DAG路径最大值
- 基于jQuery+JSON的省市联动效果
- iOS多线程之NSOperation
- 今天看到了一款mini小画板的程序,看起来不错,跟大家分享一下
- 【我的随感】为什么你会动摇?是自己一开始就错了吗?一定要学会放弃,但放弃前一定一定要慎重