NSThread的使用:
// 创建线程方式1
- (void)test1
{
// 实例化一个线程对像
// target:谁要创建线程
// selector:为那个方法开辟线程
// objec:传给run方法的参数
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run:) object:nil];
// 让线程开始工作,启动线程, 在新开的线程执行run方法
[thread start];
}
// 创建线程方式2
- (void)test2
{
[NSThread detachNewThreadSelector:@selector(run:) toTarget:self withObject:@"hello"];
}
// 创建线程方式3
- (void)test3
{
// “隐式”创建线程方式
[self performSelectorInBackground:@selector(run:) withObject:@"cz"];
}
+ (NSThread *)mainThread; //获得主线程
- (BOOL)isMainThread; //是否为主线程
+ (BOOL)isMainThread; //是否为主线程
其他用法
NSThread*current = [NSThread currentThread];
+ (double)threadPriority;
+ (BOOL)setThreadPriority:(double)p;
- (double)threadPriority;
- (BOOL)setThreadPriority:(double)p;
NSThread *threadA = [[NSThread alloc] initWithTarget:self selector:@selector(run:) object:@"hello"];
threadA.name = @"thraed A";
// 线程优先级
// 是一个浮点数,0.0~1.0。 默认值 0.5
// 开发的时候,一般不去修改优先级的值。
// 优先级,必须调用很多次的时候,才能体现出来。
threadA.threadPriority = 0.1;
// 开始工作
[threadA start];
调度优先级的取值范围是0.0 ~ 1.0,默认0.5,值越大,优先级越高
- (void)setName:(NSString *)n;
-( NSString*)name;线程的状态
控制线程状态
- (void)start;
+ (void)sleepUntilDate:(NSDate*)date;
+ (void)sleepForTimeInterval:(NSTimeInterval)ti;
+ (void)exit;
注意:一旦线程停止(死亡)了,就不能再次开启任务
@synchronized(锁对象) { // 需要锁定的代码 }
开发的时候,一般就使用self就OK
苹果不推荐我们使用加锁。因为加锁,性能太差。
注意:锁定1份代码只用1把锁,用多把锁是无效的
/**
1. 开发比较复杂的多线程程序时,可以先在主线程把功能实现
2. 实现功能以后,再把耗时的功能再放到子线程
3. 再增加一个线程,建议开发的时候,线程一个一个增加
*/
/**
加锁,互斥锁
加锁,锁定的代码尽量少。
加锁范围内的代码, 同一时间只允许一个线程执行
互斥锁的参数:任何继承 NSObject *对象都可以。
要保证这个锁,所有的线程都能访问到, 而且是所有线程访问的是同一个锁对象
*/
//在主线程执行 selector 方法
//(id)arg:传递给selector方法的参数- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;
// 在指定线程执行selector方法
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait;