本文转载自微信公众号「我是开发者FTD」,作者FTD 。转载本文请联系我是开发者FTD公众号。
从上一节,我们已经知道Java中线程一共有6种状态,在正式开始介绍之前,先给大家介绍一个监控线程状态的工具,也是JDK自带的工具。通过这个工具,我们可以更清晰的看到线程此时此刻所处的状态是什么。
找到 JDK 的安装目录,在bin目录下可以找到JDK自带的监控工具VisualVM,例如我的目录是D:\Program Files\Java\jdk1.8.0_251\bin\jvisualvm.exe,如下图所示:
双击打开VisualVM,如下图所示:
从上图可以看到,我本地起了五个Java应用,一个是VisualVM程序本身,一个就是IntelliJ IDE工具了,另外几个是本地Java应用。
我们双击VisualVM,可以在右边栏看到它的一个运行情况,我们选择切换到线程标签,就可以看到它当前正在运行的线程的整体情况了。如下图所示:
我们在右边栏的下方,选择一个线程,可以看到当前线程是处于一个WAITING状态,显示是在一个LinkedList对象上处于了等待,如下图所示:
注:截图中下方的 Thread inspector 窗体是一个插件,默认是没有安装的,可在“菜单--工具--插件”下面找到它并安装即可。如下图所示:
注:我这里已经安装过了, 所以会在已安装那里显示
好了,有了这个工具后,我们就可以通过它来分析线程的状态了,接下来我们再来一起看下Java中的这6个状态,首先从简单的谈起。
新建态(NEW)
当使用new Thread()创建一个新的线程,又还没有开始执行(not yet started)它的时候就处于新建(NEW)状态。这里所谓“开始执行”具体指显式的调用线程类中的start方法。
注:你不能直接调用run方法,这样的话还是在原线程上执行。只有调用start方法才会开启新的执行线程,接着它会去调用run。
在start之后,线程进入RUNNABLE状态,之后还可能会继续转换成其它状态。
注:一个线程只能被start一次。
终止态(TERMINATED)
终止状态,这个也没什么好说的,线程执行完成后(completed execution)或者说线程退出了(exited),此时线程就进入了终止状态。
其它状态
余下的几个状态,由于无法简单几句说完,这里先作些简介,后面会一一详细介绍:
- RUNNABLE:前面有提到,它指“正在Java虚拟机中执行”,可能是ready,也可能是running,总之是在runnable。
- 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”之类的动作,时间到了也会自动退出这一状态。
其他状态我们在下篇开始一一详解。