关于Java的线程状态

转载 https://my.oschina.net/goldenshaw/blog/386788

Java线程有6种状态。在某个给定时间点上,一个线程只能处于这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.)
JVM中则统一成了一种状态,也可能操作系统中的一种状态在JVM中又细分成了两种状态,谁知道呢?你也不想去知道,反正我是不想去知道。而很多关于操作系统上的书则常会提到有5种进程(process)状态:new,ready,running,waiting,terminated。

不幸的是,有很多的书上常常把这些进程状态,线程状态与Java线程状态混在一起谈。这里所谓“进程状态”指早期的那种“单线程进程”的状态。 对于现在普遍的“多线程进程”,显然,谈论“进程状态”已经没有意义,应该谈论“进程下某个线程的状态”或者直接说“线程状态”。不过有时还是会把“进程状态”和“线程状态”混着去说。有些系统把线程叫成“轻量级进程”(light-weight process),所以还是在谈“进程状态”。有时则甚至既不叫“进程”,也不叫“线程”,它们叫“task”或者“job”。总之还是有些乱的,我们不妨就拿Windows系统为例,用的就是“进程”和“线程”这两种较为标准的叫法,这时一个进程下至少有一个线程,线程是CPU调度的基本单位,进程不参与CPU调度,CPU根本不知道进程的存在。


    至于Java线程的状态,有的说有4种状态,有的说有5种,各种各样的说法都有。比如看到Java只有RUNNABLE(可运行的)状态,就觉得这还不够呀,应该还有Running(运行中)状态;又或者觉得RUNNABLE就是Running,所以应该还有个Ready(就绪)状态才对。然而这些说法都是不准确的!如果我们读下Thread.State源码中的注释中,它说得很清楚:These states are virtual machine states which do not reflect any operating system thread states。这些状态是虚拟机状态,它不反映任何操作系统的线程状态。一个 Java 线程它所对应的操作系统内核线程中的状态可能有Running又有Ready,但在虚拟机层面则统一映射成了RUNNABLE。如果Java中觉得没必要去区分这些,我们又何必去纠结这些呢?以RUNNABLE为例,源码中的注释是这样说的:executing in the Java virtual machine(正在Java虚拟机中执行)至于它是否真正在执行,不是我们要操心的事。还有的情况则比如把Java状态中的BLOCKED,WAITING,TIMED_WAITING三种状态都笼统地称为blocked或者waiting;操作系统也许只有一种状态,但这一次,Java作了细分,给出了三种状态。很多声称Java线程只有4种或5种状态常常都是自作主张地合并了这些状态,把这些东西混为一谈是非常容易引发混乱的。我们将会在后面具体地谈到。又或者把TIMED_WAITING当作不存在,从来不提有这个状态。显然,这种做法又是受到传统进程状态划分的影响。尽管它与WAITING很像,我们最好按着Thread.State中的定义来,不要自己随意发挥。综上所述,为避免出现混乱,厘清概念所处的层次是非常重要的。如无特别说明,讨论均在JVM层面上。具体而言,比如当说到WAITING状态时,指的就是Thread.State.WAITING。

有了以上基础,才能在接下来更好地去分析这6种状态。

具体状态分析
接下来再来细看这6个状态,首先从简单的谈起。

NEW
当使用new Thread()创建一个新的线程,又还没有开始执行(not yet started)它的时候就处于NEW状态。这里所谓“开始执行”具体指调用线程类中的start方法。注意:你不能直接调用run方法,这样的话还是在原线程上执行。只有调用start方法才会开启新的执行线程,接着它会去调用run。在start之后,线程进入RUNNABLE状态,之后还可能会继续转换成其它状态。
注:一个线程只能被start一次。

TERMINATED
终止状态,这个也没什么好说的,完成了执行后(completed execution)或者说退出了(exited)。线程就进入了终止状态。
RUNNABLE:前面有提到,它指“正在Java虚拟机中执行”。


BLOCKED:等待监视器锁(waiting for a monitor lock )这是一种特殊的waiting,实际上就是被synchronized方法或者块阻塞。monitor有些书上通常叫”管程“,我也不太确定要怎么叫它。这里叫成”监视器“也是取字面的意思。


WAITING:无限期等待另一个线程执行一个特别的动作。(waiting indefinitely for another thread to perform a particular action )这里所谓的动作通常即是指“notify或是notifyAll”。


TIMED_WAITING:限时等待另一个线程执行一个动作。(waiting for another thread to perform an action for up to a specified waiting time )如果没有等到如“notify”之类的动作,时间到了也会自动退出这一状态。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值