概述
线程从创建到销毁中间存在很多种状态。
线程的状态
通过NSThread创建一条线程,开发者需要负责线程的创建和执行,线程的销毁由系统决定。创建一个继承NSThread的FMThread类,重写dealloc方法,验证线程对象销毁。
#import "ViewController.h"
#import "FMThread.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
FMThread *thread = [[FMThread alloc] initWithTarget:self selector:@selector(thread) object:nil];
[thread start];
}
- (void)thread
{
for (int i=0; i<5; i++) {
NSLog(@"--------------%d", i);
}
}
@end
在控制台输出发现线程对象的任务执行完毕,线程对象的dealloc方法执行。也就是说在线程中的任务执行完毕系统将NSThread线程对象销毁。
下面详细展示线程的状态
- 通过NSThread创建一个线程对象,此时内存中存在该线程对象。此时的线程对象处于
新建状态
。 - 调用线程start方法。系统会把线程对象放入内存中的
可调度线程池
。此时线程对象处于就绪状态
。CPU会对可调度线程池中的线程随机分配资源。 - 当CPU调度当前线程时,该线程处于
运行状态
,此时线程就在执行线程中的任务。 - 当CPU调度到其它线程对象时,该线程又回到就绪状态,等待CPU调度。
- 调用线程的sleep或者等待同步锁操作,该线程会从
可调度线程池
移除。进入阻塞状态
。这时候的线程不会被CPU调度 - 当线程的sleep到时或者得到同步锁,线程又被添加进可调度线程池进入就绪状态被CPU调度。
- 如果线程中的任务执行完毕或者程序异常退出,线程就会进入"死亡"状态。
常见的操作线程状态的方法
// 线程睡眠/堵塞两秒
[NSThread sleepForTimeInterval:2];
[NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:2]];
// sleep到遥远的未来
[NSThread sleepUntilDate:[NSDate distantFuture]];
// 直接退出线程
[NSThread exit];
注意:一旦线程死亡,就不能再次开启任务。