如何在Java中区分RUNNING状态与java.lang.Thread.State.RUNNABLE

时间:2019-04-07 12:08:44

标签: java multithreading

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

Java doc中线程的所有状态:

  

java.lang公共类Thread.State

     

扩展枚举

     

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

     

NEW尚未启动的线程处于这种状态。

     

RUNNABLE在Java虚拟机中执行的线程处于这种状态。

     

BLOCKED处于等待监视器锁定状态的被阻塞线程处于这种状态。

     

正在等待一个线程,该线程无限期地等待另一个线程执行特定操作。

     

TIMED_WAITING处于等待状态的线程处于指定等待时间的线程处于这种状态。

     

TERMINATED退出的线程处于这种状态。

     

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

package bj.thread;

public class ThreadApp2 {

    public static void main(String[] args) {
        System.out.println(Thread.currentThread().getState());
    }
}

输出:

RUNNABLE

2 个答案:

答案 0 :(得分:1)

正如您所说,可运行线程可能实际上在运行或未在运行。操作系统要给线程时间来运行。但是, Java规范并未将其称为单独状态。正在运行的线程仍处于可运行状态,并且无法通过简单的方式通过java区分这两个状态

答案 1 :(得分:1)

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

if (t.isRunning()) {
    doXYandZ();
}

问题是,即使线程tisRunning()调用期间的某个时刻正在运行,也无法保证它会仍然运行。时间t.isRunning()返回true.不能保证它不会在doXYandZ()调用期间的某个时间停止运行。

操作系统能够区分正在运行的线程和不是因为该状态由操作系统 控制的线程,并且操作系统需要记住哪些线程正在运行以及哪些线程正在运行不是因为调度它们是操作系统的工作。

Java运行时环境无法区分RUNNING和RUNNABLE,因为它无法控制在任何给定时间实际正在运行哪些线程,并且它无法对该状态的变化做出有意义的反应。