服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - Java多线程之线程状态

Java多线程之线程状态

2021-12-27 23:16我是开发者FTDFTD Java教程

关于Java线程的状态,有的人可能会说有4种状态,有的会说有5种,6种,总之各种各样的说法可能都有。造成这种情况的原因是:有很多的书上常常把操作系统进程状态,线程状态与Java线程状态混在一起谈。

Java多线程之线程状态

关于Java线程的状态,有的人可能会说有4种状态,有的会说有5种,6种,总之各种各样的说法可能都有。造成这种情况的原因是:有很多的书上常常把操作系统进程状态,线程状态与Java线程状态混在一起谈。下面这个图相信大家在讲多线程的文章中都见到过(或类似):

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种状态,如下图所示:

Java多线程之线程状态

状态含义:

  • 新建态 (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的线程状态

原文链接:https://mp.weixin.qq.com/s/1jvY9jSTYcEzvMWmVYWDCw

延伸 · 阅读

精彩推荐
  • Java教程Java BufferWriter写文件写不进去或缺失数据的解决

    Java BufferWriter写文件写不进去或缺失数据的解决

    这篇文章主要介绍了Java BufferWriter写文件写不进去或缺失数据的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望...

    spcoder14552021-10-18
  • Java教程Java8中Stream使用的一个注意事项

    Java8中Stream使用的一个注意事项

    最近在工作中发现了对于集合操作转换的神器,java8新特性 stream,但在使用中遇到了一个非常重要的注意点,所以这篇文章主要给大家介绍了关于Java8中S...

    阿杜7482021-02-04
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    这篇文章主要介绍了Java使用SAX解析xml的示例,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程升级IDEA后Lombok不能使用的解决方法

    升级IDEA后Lombok不能使用的解决方法

    最近看到提示IDEA提示升级,寻思已经有好久没有升过级了。升级完毕重启之后,突然发现好多错误,本文就来介绍一下如何解决,感兴趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java实现抢红包功能

    Java实现抢红包功能

    这篇文章主要为大家详细介绍了Java实现抢红包功能,采用多线程模拟多人同时抢红包,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙...

    littleschemer13532021-05-16
  • Java教程小米推送Java代码

    小米推送Java代码

    今天小编就为大家分享一篇关于小米推送Java代码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧...

    富贵稳中求8032021-07-12
  • Java教程xml与Java对象的转换详解

    xml与Java对象的转换详解

    这篇文章主要介绍了xml与Java对象的转换详解的相关资料,需要的朋友可以参考下...

    Java教程网2942020-09-17
  • Java教程20个非常实用的Java程序代码片段

    20个非常实用的Java程序代码片段

    这篇文章主要为大家分享了20个非常实用的Java程序片段,对java开发项目有所帮助,感兴趣的小伙伴们可以参考一下 ...

    lijiao5352020-04-06