新生->new
就绪->start
运行->CPU调度
结束->stop,run方法执行完
阻塞->sleep
- 线程分为被新生、就绪、运行、阻塞、消亡五种状态。
- 被new创建后需要调用start方法,等待CPU调用
- start后的状态态,即具有运行资格,但没有运行权的线程所处状态。当某一时间点,线程没有获得CPU的执行权,就是处于这个状态。
- 阻塞(blocked),即 放弃执行资格 的线程所处状态,目的是让线程暂时停止,让别的线程先运行。有两种方法可以让线程进入阻塞状态。
- 调用sleep(time)静态方法,使线程进入冻结状态中的睡眠状态,且在time即时间到了之后,自动解除冻结状态。 这里会占用资源,抱着资源睡觉。不会释放锁。此特点对比wait的。可以模拟网络延时,倒计时。
- 调用wait()方法,使线程进入冻结状态中的等待状态,且只有当用notify()等函数将其“唤醒”之后,才解除冻结。
- 解除阻塞状态之后,线程不是直接进入运行状态,因为此时不能获取到CPU的执行权。而是进入临时状态。
直接回到等待CPU调用 还可以,调用yield()静态方法,礼让。成员方法,join()可以阻塞线程等待其他线程执行完,再开始。 - 消亡,即线程结束.当调用stop()方法现在已经弃用,自己增加一个标志位,提供外部方法调用。或者run方法运行结束(不要就是不要有死循环)后。线程进入消亡状态。
进入就绪状态四种情况
- start方法调用
- 阻塞解除
- yield 礼让
- jvm切换线程
thread.state
- NEW
尚未启动的线程处于此状态 - RUNABLE
在java虚拟机中执行的线程 - BLOCKED
被阻塞等待监视器锁定的线程处于此状态 - WAITING
正在等待另一个线程执行特定动作 - TIMED_WAITING
正在等待另一个线程执行动作达到指定等待时间的线程 - TERMINATED
已退出的线程