当前位置: 首页 > 科技观察

Java多线程之线程状态

时间:2023-03-12 01:21:16 科技观察

关于Java线程的状态,可能有人会说有4个状态,也有人会说有5、6个状态。总之,可能有多种说法。之所以会这样,是因为很多书籍经常混淆操作系统进程状态、线程状态和Java线程状态。下图相信大家在多线程(或类似)的文章中都看过:这其实就是操作系统书籍中经常提到的五种进程状态:new、ready、running、waiting、terminated。其实最简单的方法就是直接查看Java源码,就知道Java中线程定义了多少种状态。如果我们查看JDK源码,就会发现Java语言中定义的线程状态与操作系统是不一样的。我们在Thread.State源码的注释中可以看到,非常清楚:这些状态是虚拟机状态,不反映任何操作系统线程状态。也就是说,Java语言中定义的这些状态指的是虚拟机的状态,并不反映任何操作系统的线程状态。以RUNNABLE状态为例,源码中的注释是这样写的:ExecutiveintheJavavirtualmachine(在Java虚拟机中执行)。它是否真正执行不是我们需要担心的事情。一个Java线程在其对应的操作系统内核线程中的状态可能是Running和Ready,但是在Java虚拟机层面,统一映射为RUNNABLE状态。如果在Java中不需要区分这些状态,我们就不用管它们了。在某些情况下,操作系统可能只有一种状态,但在Java中又细分了,给出了三种不同的状态。比如Java状态中的BLOCKED、WAITING、TIMED_WAITING三种状态都会被泛化。它被称为阻塞或等待。或者将TIMED_WAITING状态视为不存在。这种状态在很多文章中都没有提到过。显然,这种做法受到了传统流程状态划分的影响。虽然和WAITING很像,但是我们还是按照Thread.State里面的定义来,不要自己玩。所以很明显,很多声称Java线程只有4、5个状态的文章,往往会主动合并这些状态。这些东西混淆的时候是非常容易造成混淆的,这个我们后面会具体说。讨论过。综上所述,为了避免混淆,厘清概念的层次非常重要。下面以JDK1.8源码为标准介绍Java线程的6种状态。我们来看看JDK中线程状态的定义。线程的6种状态在Thread类的内部枚举类Thread.State中明确定义,如下图:.(尚未启动的线程处于此状态。)RUNNABLE:Java虚拟机中正在执行的线程处于此状态。(在Java虚拟机中执行的线程处于这种状态。)阻塞状态(BLOCKED):阻塞等待监视器锁的线程处于这种状态。(被阻塞等待监视器锁的线程处于这种状态。)等待状态(WAITING):无限期等待另一个线程执行特殊操作的线程处于这种状态。(无限期等待另一个线程执行特定操作的线程处于此状态。)定时等待(TIMED_WAITING):等待另一个线程在时限内执行操作的线程处于此状态。(等待另一个线程执行某个动作的线程达到指定的等待时间即处于此状态。)终止状态(TERMINATED):已退出的线程处于此状态。(已经退出的线程处于这种状态。)在程序运行的给定时间点,Java线程只能处于这6种状态中的一种。通过上面的介绍,相信大家可以清楚清楚的知道Java线程状态有多少种状态,分别有哪些状态。虽然你可能对每个线程状态的详细含义不是特别了解,但是不用担心。后面我们会一一介绍,敬请关注后续文章。参考:关于Java的线程状态