一、线程的 6 种状态
就像生物从出生到长大、最终死亡的过程一样,线程也有自己的生命周期,在 Java 中线程的生命周期中一共有 6 种状态。
1.New(新创建)
2.Runnable(可运行)
3.Blocked(被阻塞)
4.Waiting(等待)
5.Timed Waiting(计时等待)
6.Terminated(被终止)
如果想要确定线程当前的状态,可以通过 getState() 方法,并且线程在任何时刻只可能处于 1 种状态。
如图所示
需要注意的是
Java 中的 Runable 状态对应操作系统线程状态中的两种状态,分别是 Running 和 Ready,也就是说,Java 中处于 Runnable 状态的线程有可能正在执行,也有可能没有正在执行,正在等待被分配 CPU 资源。所以,如果一个正在运行的线程是 Runnable 状态,当它运行到任务的一半时,执行该线程的 CPU 被调度去做其他事情,导致该线程暂时不运行,它的状态依然不变,还是 Runnable,因为它有可能随时被调度回来继续执行任务。
当线程调用notify()和notifyAll()方法时,被唤醒的线程并不是立马进入Runnable状态而是进入Blocked状态 应为唤醒线程的线程正在持有monitor锁只有当其释放掉所占有的锁时,其他线程获取的锁才会回到Runnable状态。还有wait()/notify()/notifyAll()方法被调用时 要求必须在synchronized代码块中,原因是执行方法时需要先持有monitor锁。调用完wait()方法后会释放所持有的monitor锁