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

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

时间:2023-03-13 00:04:07 科技观察

本文转载自微信公众号《我是开发者FTD》,作者FTD。转载本文请联系本人。我是开发者FTD公众号。从上一节我们已经知道Java中线程有6种状态。在正式介绍之前,先介绍一个监控线程状态的工具,也是JDK自带的工具。通过这个工具,我们可以更清楚的看到线程此时此刻是什么状态。找到JDK的安装目录。在bin目录下,可以找到JDK自带的监控工具VisualVM。比如我的目录是D:\ProgramFiles\Java\jdk1.8.0_251\bin\jvisualvm.exe,如下图:双击OpenVisualVM,如下图:上图中,我在本地启动了五个Java应用程序,一个是VisualVM程序本身,一个是IntelliJIDE工具,另外几个是本地Java应用程序。我们双击VisualVM,可以在右边的栏目中看到它的运行状态。如果我们选择切换到线程选项卡,我们可以看到其当前正在运行的线程的整体状态。如下图:我们在右栏下方选中一个线程,可以看到当前线程处于WAITING状态,这说明它正在等待一个LinkedList对象,如下图:注意:截图底部的线程inspectorwindow是一个插件,默认没有安装。您可以在“菜单--工具--插件”下找到它并安装它。如下图所示:注意:我这里已经安装好了,所以会在安装的地方显示。有了这个工具,我们就可以用它来分析线程的状态了。接下来,我们一起来看看Java吧。在这6个状态中,我们先从一个简单的开始。新状态(NEW)当使用newThread()创建一个新线程时,它还没有开始执行(还没有开始)它就处于新状态(NEW)。这里所谓的“开始执行”特指在线程类中显式调用start方法。注意:不能直接调用run方法,这样还是在原线程上执行。只有调用start方法才会启动一个新的执行线程,然后调用run。线程启动后进入RUNNABLE状态,之后可能会继续过渡到其他状态。注意:一个线程只能启动一次。终止状态(TERMINATED)终止状态,这个没什么好说的。当线程执行完成(completedexecution)或线程退出(exited)后,此时线程进入终止状态。其他状态的剩余状态不是几句话就能说完的。这里简单介绍一下,后面会详细介绍它们:RUNNABLE:前面说了,指的是“在Java虚拟机中执行”,可能是ready,也可能是running,简而言之就是runnable。BLOCKED:Waitingforamonitorlock(等待监视器锁)这是一种特殊的等待,实际上是被同步方法或块阻塞。monitor在一些书上一般都叫monitor,不知道怎么称呼。这里所说的“监视器”也是按字面意思来的。等待:无限期等待另一个线程执行特定操作。(无限期地等待另一个线程执行特定的动作)这里所谓的动作通常是指“notify或notifyAll”。TIMED_WAITING:等待另一个线程执行动作的有限时间。(等待另一个线程执行一个动作最多指定的等待时间)如果没有“notify”等动作,时间到了会自动退出这个状态。我们将在下一篇文章中详细解释其他状态。