温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java线程没有Running状态的原因

发布时间:2021-06-12 09:22:15 来源:亿速云 阅读:710 作者:小新 栏目:编程语言

小编给大家分享一下Java线程没有Running状态的原因,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

Java线程没有Running状态的原因

Java线程没有Running状态的原因

Java线程没有Running状态的原因

Java线程没有Running状态的原因

Java线程没有Running状态的原因

Java线程没有Running状态的原因

Java线程没有Running状态的原因

在多线程操作系统中,通常是在一个进程中包括多个线程,每个线程都是作为利用CPU的基本单位,是花费最小开销的实体。

线程是有状态的,线程的状态被定义在Thread.State枚举中,在Java Doc中也有明确的解释:

Java线程没有Running状态的原因

通过查看源码以及阅读Java Doc,我们可以知道,线程主要有以下6种状态:

  • NEW

当一个线程被创建出来的,但是还没调用start()方法的时候,他处于NEW状态。

  • RUNNABLE

在Java虚拟机中执行的线程处于这种状态

  • BLOCKED

正在等待锁的阻塞线程处于这种状态。

  • WAITING

不确定地等待另一个线程执行某个特定操作的线程就是处于这种状态,进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。

  • TIMED_WAITING

在指定的等待时间内等待另一个线程执行某个操作的线程处于这种状态。该状态不同于WAITING,它可以在指定的时间后自行返回。

  • TERMINATED

已经退出的线程处于这种状态。

在指定的时间点,线程只能处于一种状态。但是需要注意的是这些状态表示的是虚拟机中线程的状态,而不是任何操作系统线程状态。

Java线程没有Running状态的原因

Java线程没有Running状态的原因

线程之间的状态是可以互相转换的,如下图:

Java线程没有Running状态的原因

上图,就是线程的6种状态的转换图,当遇到不同的操作或者事件的时候,线程的状态就可能发生变化。

Java  Doc中说在Java虚拟机中正在执行的线程处于RUNNABLE状态,但是,在操作系统层面,一个线程要想被执行,是需要获得CPU的使用权的。

Java线程没有Running状态的原因

Java线程没有Running状态的原因

Java线程没有Running状态的原因

Java线程没有Running状态的原因

我们其实还可以把RUNNABLE状态进一步细化一下,根据线程是否获得了CPU的使用权分成两种:

就绪(READY):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中并分配cpu使用权  。

运行中(RUNNING):就绪(READY)的线程获得了cpu 时间片,开始执行程序代码。

Java线程没有Running状态的原因

也就是说,当一个线程被创建出来之后,执行了start方法之后,在没有获得cpu的使用权的时候,他就是就绪状态(READY),在获得了CPU的使用权,开始执行的时候,就是运行状态(RUNNING)了。

Java线程没有Running状态的原因

Java线程没有Running状态的原因

Java线程没有Running状态的原因

Java线程没有Running状态的原因

为什么没有定义RUNNING状态?

对于现在的分时操作系统来说,在单CPU情况下,所有的线程其实都是串行执行的。但是为了让我们看起来像是在并发执行,人们把CPU的执行分成很多个小的时间片。

哪个进程得到时间片,那个线程就执行,时间片到了之后,就要释放出CPU,再重新进行争抢时间片。

只要把时间片划分的足够细,那么多个程序虽然在不断的串行执行,但是看起来也像是在同时执行一样。

Java线程没有Running状态的原因

那么,CPU的时间片其实是很短的,一般也就是10-20毫秒左右。

那么,也就是说,在一秒钟之内,同一个线程可能一部分时间处于READY状态、一部分时间处于RUNNING状态。

那么如果,明确的给线程定义出RUNNING状态的话,有一个很大的问题,就是这个状态其实是不准的。

因为当我们看到线程是RUNNING状态的时候,很有可能他已经丢失了CPU时间片了。

对于线程的状态,我们只需要知道,他当前有没有在"正在参与执行"就行了,何为"参与执行"?

就是他的状态是可执行的,只要获得时间片,就能立即执行。

那这不就是RUNNABLE吗?

所以,Java就没有给线程定义RUNNING状态,而是定义了一个RUNNABLE状态。

Java线程没有Running状态的原因Java线程没有Running状态的原因

Java线程没有Running状态的原因

Java线程没有Running状态的原因

Java线程没有Running状态的原因

Java线程没有Running状态的原因

以上是“Java线程没有Running状态的原因”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI