Java多线程之线程状态

好用的小火箭节点推荐⭐Shadowrocket高速节点推荐

在开始讲解之前,我想做一个小调查,大家在学习线程时,知道Java中线程一共有几种状态吗?大家可以在下方投票一下。

关于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.)

版权声明:
作者:shadowrocket
链接:https://www.shadowrockets.wang/630.html
来源:Shadowrocket官网
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>