NSThread 线程睡眠
如果需要让当前正在执行的线程暂停一段时间,并进入阻塞状态,则可以通过调用NSThread 类的静态。sleepXxx方法来完成。提供如下两个控制线程暂停的类方法:
//让当前正在执行的线程暂停到date(代表时间)并进入阻塞状态。
+ (void)sleepUntilDate:(NSDate *)date;
//让当前正在执行的线程暂停ti秒,并进入阻塞状态。
+ (void)sleepForTimeInterval:(NSTimeInterval)ti;
> 调用这两个方法进入阻塞状态后,在其睡眠时间段内,该线程不会获得执行的机会,因此常用这两个方法来暂停线程的执行,
// 暂停当前线程 暂停两秒 sliːp
[NSThread sleepForTimeInterval:2];
// 或者
NSDate * date = [NSDate dateWithTimeInterval:2 sinceDate:[NSDate date]];
[NSThread sleepUntilDate:date];
线程的优先级
每个线程执行时都有一定的优先级,优先级高的线程获得较多的执行机会,每个子线程默认的优先级为0.5。
NSThread提供了如下实例方法来设置获取线程的优先级:
(prʌɪˈɒrɪti 优先)
+ (double)threadPriority;//该类方法获取当前正在执行的线程的优先级
- threadPriority://该实例方法获取调用该方法线程对象的优先级
+ (BOOL)setThreadPriority:(double)p;//该类方法用于设置当前正在执行的线程的优先级
- (BOOL)setThreadPriority:(double)p;//该实例方法用于设置该方法的线程对象的优先级
参数类型double 范围是0.0~1.0 其中1.0代表最高优先级,0.0代表最低优先级
NSLog(@"UI线程的优先级为:=======%g" , [NSThread threadPriority]);
// 创建第一个线程对象
NSThread* thread1 = [[NSThread alloc]initWithTarget:self selector:@selector(run) object:nil];
// 设置第一个线程对象的名字
thread1.name = @"线程A";
NSLog(@"线程A的优先级为:=======%g" , thread1.threadPriority);
// 设置使用最低优先级
thread1.threadPriority = 0.1;
NSLog(@"线程A的优先级为:=======%g" , thread1.threadPriority);
// 创建第二个线程对象
NSThread* thread2 = [[NSThread alloc]initWithTarget:self selector:@selector(run) object:nil];
// 设置第二个线程对象的名字
thread2.name = @"线程B";
NSLog(@"线程B的优先级为:---------%g" , thread2.threadPriority);
// 设置使用最高优先级
thread2.threadPriority = 0.9;
NSLog(@"线程B的优先级为:---------%g" , thread2.threadPriority);
// 启动2个线程
[thread1 start];
[thread2 start];
- (void)run
{
for(int i = 0 ; i < 100 ; i++)
{
NSLog(@"-----%@----%d" , [NSThread currentThread].name, i);
}
}
根据输出结果我们会发现 线程B 并"不是"被优先执行,为什么?