Java多线程之线程状态详解之一

开发 后端
我们已经知道Java中线程一共有6种状态,在正式开始介绍之前,先给大家介绍一个监控线程状态的工具,也是JDK自带的工具。通过这个工具,我们可以更清晰的看到线程此时此刻所处的状态是什么。

[[442479]]

本文转载自微信公众号「我是开发者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”之类的动作,时间到了也会自动退出这一状态。

 

其他状态我们在下篇开始一一详解。

 

责任编辑:武晓燕 来源: 我是开发者FTD
相关推荐

2021-12-26 18:22:30

Java线程多线程

2021-12-14 08:28:08

Java多线程线程

2017-05-27 20:59:30

Java多线程synchronize

2021-04-26 06:54:15

Redis多线程单线程

2010-03-16 17:16:38

Java多线程

2010-01-21 11:25:44

linux多线程线程资源

2011-06-22 16:08:40

Qt 多线程 事件循环

2021-02-25 15:58:46

C++线程编程开发技术

2021-03-05 07:38:52

C++线程编程开发技术

2011-06-22 16:02:37

Qt 多线程 重入

2009-03-12 10:52:43

Java线程多线程

2017-05-31 14:03:07

Java多线程内置锁与显示锁

2009-06-17 11:23:00

Java多线程

2013-06-07 16:30:08

iOS多线程iOS开发NSThread

2017-05-08 11:46:15

Java多线程

2009-06-29 17:49:47

Java多线程

2009-06-11 10:22:18

Java多线程

2013-07-16 10:12:14

iOS多线程多线程概念多线程入门

2022-05-20 10:20:17

Spring事务MyBatis

2012-02-14 12:31:27

Java
点赞
收藏

51CTO技术栈公众号