关于Java线程的状态,有的人可能会说有4种状态,有的会说有5种,6种,总之各种各样的说法可能都有。造成这种情况的原因是:有很多的书上常常把操作系统进程状态,线程状态与Java线程状态混在一起谈。下面这个图相信大家在讲多线程的文章中都见到过(或类似):
这些其实是操作系统上的书上常会提到的5种 进程(process) 状态:new,ready,running,waiting,terminated。
其实最简单的就是直接查看Java源码,就知道Java中线程到底定义了几种状态。如果我们查看JDK源码的话,就会发现Java语言中定义的线程状态是不同于操作系统的,我们可以在Thread.State源码中的注释中看到,它说得很清楚:
These states are virtual machine states which do not reflect any operating system thread states。
也就是说Java语言中定义的这些状态都是指虚拟机状态,它不反映任何操作系统的线程状态。
以RUNNABLE状态为例,源码中的注释是这样说的:executing in the Java virtual machine(正在Java虚拟机中执行)。至于它是否真正在执行,不是我们要操心的事。
一个 Java 线程它所对应的操作系统内核线程中的状态可能有Running又有Ready,但在Java虚拟机层面则统一映射成了RUNNABLE 状态。如果Java中觉得没必要去区分这些状态,我们也就没有必要去纠结这些了。
还有一些情况下,操作系统也许只有一种状态,但在Java中又作了细分,给出了三种不同的状态,例如会把Java状态中的 BLOCKED,WAITING,TIMED_WAITING 三种状态都笼统地称为 blocked 或者 waiting 。
又或者把TIMED_WAITING 状态当作不存在,在很多文章中从来不提有这个状态,显然,这种做法又是受到传统进程状态划分的影响。尽管它与WAITING很像,我们最好按着 Thread.State 中的定义来,不要自己随意发挥。
所以这就明白了,那些很多声称Java线程只有4种或5种状态的文章,常常都是自作主张地合并了这些状态,把这些东西混为一谈是非常容易引发混乱的,这个我们将会在后面具体谈到。
综上所述,为避免出现混乱,厘清概念所处的层次是非常重要的。
下面我们就以 JDK1.8 源码中为标准,分别给大家介绍一下Java线程的这6种状态,下面我们先来看一下 JDK 中对于线程状态的定义都有哪些。
线程的6种状态
在 Thread 类的一个内部枚举类 Thread.State 中明确地定义这6种状态,如下图所示:
状态含义:
- 新建态 (NEW):一个尚未启动的线程处于这一状态。(A thread that has not yet started is in this state.)
- 运行态(RUNNABLE):一个正在 Java 虚拟机中执行的线程处于这一状态。(A thread executing in the Java virtual machine is in this state.)
- 阻塞态(BLOCKED):一个正在阻塞等待一个监视器锁的线程处于这一状态。(A thread that is blocked waiting for a monitor lock is in this state.)
- 等待态(WAITING):一个正在无限期等待另一个线程执行一个特别的动作的线程处于这一状态。(A thread that is waiting indefinitely for another thread to perform a particular action is in this state.)
- 计时等待(TIMED_WAITING):一个正在限时等待另一个线程执行一个动作的线程处于这一状态。(A thread that is waiting for another thread to perform an action for up to a specified waiting time is in this state.)
- 终止态(TERMINATED):一个已经退出的线程处于这一状态。(A thread that has exited is in this state.)
在程序运行的某个给定时间点上,一个Java线程只能处于这6种状态中的一种。
通过上面的介绍,相信大家就可以很清晰的、明确的知道Java线程状态到底有几种状态,又分别都有哪些状态了,虽然可能对各个线程状态的详细含义还不是特别了解,别着急,后面我们会逐一介绍,请大家多多关注后续文章。
参考:
关于Java的线程状态