这里谈论的是Java虚拟机层面所暴露给我们的状态,与操作系统底层的线程状态是两个不同层面的事。具体而言,这里说的 Java 线程状态均来自于 Thread 类下的 State 这一内部枚举类中所定义的状态:

它与传统的线程状态的对应可以如下来看:

RUNNABLE 状态对应了传统的 ready, running 以及部分的 waiting 状态。而 BLOCKED 状态是只跟 synchronize 机制有关的一个状态。
概括的解释下线程的几种可用状态。
新建( new ):新创建了一个线程对象;
可运行( runnable ): 线程对象创建后,其他线程(比如 main 线程)调用了该对象的 start ()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获 取CPU的使用权;
运行( running ): 可运行状态( runnable )的线程获得了CPU时间片( timeslice ) ,执行程序代码;
阻塞( block ):阻塞状态是指线程因为某种原因放弃了CPU 使用权,也即让出了 CPU timeslice ,暂时停止运行。直到线程进入可运行( runnable )状态,才有 机会再次获得 cpu timeslice 转到运行( running )状态。
阻塞的情况分三种:
- 等待阻塞:运行( running)的线程执行o. wait ()方法, JVM会把该线程放入等待队列(waitting queue )中。
- 同步阻塞:运行( running)的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM 会把该线程放入锁池( lock pool )中。
- 其他阻塞: 运行( running )的线程执行Thread.sleep (long ms)或t.join ()方法,或者发出了 I/O 请求时, JVM 会把该线程置为阻塞状态。当 sleep ()状态超时、 join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入可运行( runnable )状态。
死亡( dead ): 线程 run ()、 main () 方法执行结束,或者因异常退出了 run ()方法,则该线程结束生命周期。死亡的线程不可再次复生。

在实际工作中,我们需要关注的是block的三种情况的场景
文章转载自:
Java常考面试题
为什么Java线程没有Running状态?
网友评论