写给没有耐心的人:线程的状态大致可以分为五个:新建New状态、就绪Runnable状态、运行Running状态、阻塞Blocked状态、死亡Dead状态。
正文:
本文是按照一个线程的创建以及CPU在多个线程之间进行调度的角度来界定线程的各个状态;并且介绍是什么代码可以促使线程对象在各个状态间进行切换。
在此我下载了小码哥的教材PPT做了一个线程对象状态切换GIF动画促进理解。
1.系统分配内存创建一个线程对象,处于New状态。
NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(run:) object:@"java"];
2.利用-start
方法将线程对象加入可调度线程池,成为就绪状态
[thread start];
- start启动线程,线程进入就绪状态。当线程任务执行完毕,线程对象自动进入死亡状态。
- 可调度线程池里边的线程对象CPU都会去处理他,执行任务。所以此时就绪状态的线程对象就等着CPU来调度他。
3.CPU调度当前橙色线程对象,就处于运行状态。
这个是CPU去协调调度的事情,我们代码只要利用start将线程对象处于就绪状态即可。
4.CPU调度其他线程。橙色线程对象又回到就绪状态
这个时候线程对象处于就绪状态,又等着CPU去调度他。
5.CPU在多个线程之间调度
线程对象的状态就一直来回在3...4之间进行切换。
6.如果在5步骤中间调用了sleep方法/等待同步锁,线程对象移出可调度线程池,处于阻塞状态
//线程阻塞两秒钟
[NSThread sleepForTimeInterval:2.0];
如果做了类似这些操作,橙色线程对象就将不在可调度线程池范围内,线程就去“睡觉”去了,CPU处理不到他了,线程对象处于阻塞状态。
6.当sleep到时/得到同步锁,处于就绪状态。
5例子中代码两秒过后,睡眠时间到点儿,或者拿到了同步锁,线程对象回归可调度线程池子,再一次处于就绪状态。等待CPU来调度
7.线程任务正常执行完毕或者异常/强制退出线程,线程处于死亡状态
//开辟线程打印5次
- (void)run:(NSString *)para{
for (int i = 0; i< 5; i++) {
NSLog(@"打印第%d次",i);
}
}
//打印完5次以后线程任务正常执行完毕
//强制退出线程
[NSThread exit];
线程对象进入死亡Dead状态,从内存中销毁。