如果我们发现“某个线程卡死了”,这个时候,就需要关注线程的状态,通过状态,就能看到线程是在哪一行卡住了(阻塞),原因大概是什么。
线程的状态更准确的说是pcb的状态。Linux系统原生给pcb状态提供了很多不同的选项,windows系统也给状态提供了很多选项。但是在java当中,这些都被java虚拟机(JVM)封装好了,我们只需要关心JVM提供的几种状态即可。
Java中,对线程的状态,大概分为了6个不同的状态。
1)NEW 表示Thread对象有了,还没调用start。系统内部的线程还未创建。
2)TERMINATED 表示线程已经终止了,内核中的线程已经销毁了,Thread对象还在。
3)RUNNABLE 就绪状态 指的是这个线程“随叫随到”,要么是这个线程正在cpu上运行,要么是这个线程没在cpu上运行,但是随时可以调度到cpu上运行。
4)WAITING 表示进入阻塞的死等状态。
5) TIMED_WAITING 表示带有超时时间的阻塞状态。
6)BLOCKED 表示进行锁竞争时产生的阻塞。
后三种状态出现的原因其实都是阻塞,但是产生这三种状态的原因不一样。
几种状态之间的切换如下图:
以上,就是关于线程的几种状态。