如何在java中区分运行状态和java.lang.Thread.state.RUNNABLE

如何在java中区分运行状态和java.lang.Thread.state.RUNNABLE,java,multithreading,Java,Multithreading,当线程可运行时,它可以正在运行,也可以不运行。有没有办法将它与java.lang.Thread.State#RUNNABLE区分开来 Java文档中线程的所有状态: java.lang公共类Thread.State 扩展枚举 线程状态。线程可以处于以下状态之一: 尚未启动的新线程处于此状态 可运行Java虚拟机中执行的线程处于此状态 阻塞等待监视器锁定而被阻塞的线程处于此状态 正在无限期等待另一个线程执行特定操作的线程处于此状态 TIMED_WAITING等待等待另一个线程执行操作达指定等待时间

当线程可运行时,它可以正在运行,也可以不运行。有没有办法将它与
java.lang.Thread.State#RUNNABLE
区分开来

Java文档中线程的所有状态:

java.lang公共类Thread.State

扩展枚举

线程状态。线程可以处于以下状态之一:

尚未启动的新线程处于此状态

可运行Java虚拟机中执行的线程处于此状态

阻塞等待监视器锁定而被阻塞的线程处于此状态

正在无限期等待另一个线程执行特定操作的线程处于此状态

TIMED_WAITING等待等待另一个线程执行操作达指定等待时间的线程处于此状态

终止已退出的线程处于此状态

线程在给定时间点只能处于一种状态。这些状态是虚拟机状态,不反映任何操作系统线程状态

输出:

RUNNABLE

正如您所说,可运行线程可能正在运行,也可能没有实际运行。由操作系统决定是否给线程运行时间但是,Java规范并没有将其称为单独的状态。正在运行的线程仍处于可运行状态,不可能通过java以简单的方式区分这两种状态

假设
线程
类定义了一个函数,
boolean isRunning()
。你能用它做什么?例如,这将毫无意义:

if (t.isRunning()) {
    doXYandZ();
}
它的问题是,即使线程
t
isRunning()
调用期间的某个点上实际运行,也不能保证它在
t时仍然运行。isRunning()
返回
true。
不能保证它在
doXYandZ()期间不会停止运行
打电话

操作系统能够区分正在运行的线程和未运行的线程,因为该状态由操作系统控制,操作系统需要记住哪些线程正在运行,哪些线程没有运行,因为调度它们是操作系统的任务


Java运行时环境不区分RUNNING(运行)和RUNNABLE(可运行),因为它不控制在任何给定时间实际运行的线程,并且无法对该状态下的更改做出有意义的反应。

isAlive()
将在此处使用。您可能想了解如何使用此信息?假设您了解到您的线程正在真正运行,并决定采取一些行动。但O/S可能在下一微秒内将线程从处理器移出,您的操作将是错误的。
if (t.isRunning()) {
    doXYandZ();
}