线程的生命周期分为五种状态: 新建(New),就绪(Runnable),运行(Running),阻塞(Blocked)和死亡(Dead)。因为CPU资源一般不可能一直被一个线程长期占用,线程状态经常会在运行和阻塞之间切换。
新建(New)
使用new关键字创建了一个新线程,这时,JVM为其分配了内存,并初始化了成员变量的值。
就绪(Runnable)
当线程调用了start()方法后,就处于就绪状态了。JVM会创建方法调用栈和程序计数器等待其运行。
运行(Running)
线程获得了CPU使用权,开始执行run方法。
阻塞(Blocked)
线程因为某些原因主动或被动放弃了CPU使用权,就进入了阻塞模式。
- 等待阻塞:线程执行wait()方法,JVM就会把这个线程放入等待队列。
- 同步阻塞:获取同步锁时,若锁被其他线程占用,就会被阻塞且被放入锁池中。
- 其他阻塞:当线程调用了sleep/join方法时,JVM就会把这个线程设置成阻塞状态。
死亡(Dead)
- 正常死亡:run或者call方法执行结束,正常退出
- 异常死亡:抛出未捕获的Exception或者Error
- 调用stop:stop方法容易造成死锁,尽量不要使用。