【问题标题】:State of thread while in run() method (Java)run() 方法中的线程状态(Java)
【发布时间】:2016-06-28 17:34:21
【问题描述】:

我正在尝试理解 java 中的多线程。当我经历 Java 线程可能处于的各种状态时(新的、可运行的、运行的、等待/阻塞的、死的)。我尝试运行一些简单的代码来检查线程的状态。

我创建了一个扩展 Thread 并覆盖 run() 方法的类 MyThread

package com.practice.threads;

public class MyThread extends Thread {

    @Override
    public void run() {
        super.run();
        System.out.println("Running Mythread.");
        System.out.println("State of thread : " + this.getState()); // line 2
    }

}

现在我创建了一个简单的类来测试线程的状态:

package com.practice.threads;

public class ThreadStateDemo {

    /**
     * @param args
     */
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        System.out.println("State of thread : " + myThread.getState());  // line 1
        myThread.start();

    }

}

运行这个类给出以下输出:

线程状态:新 运行我的线程。 线程状态:RUNNABLE

第 2 行的输出是我不明白的。当一个线程实例的run()方法正在执行时,它怎么会处于RUNNABLE状态呢?我在一本书(SCJP Suncertified Programmer)中看到了 RUNNING 状态的提及。它不应该显示 RUNNING 吗?

【问题讨论】:

  • Nope, there is no RUNNING state. RUNNABLE 表示:Java 虚拟机中执行的线程处于此状态。
  • 哦,好吧!我发现 RUNNING 是一本书(SCJP Suncertified Programmer)中提到的一个状态。但没有检查 Oracle 文档。谢谢!
  • 大多数操作系统区分“可运行”(在允许线程继续之前不需要发生任何事情)和“运行”(CPU实际上正在执行线程的代码)。但是,Java 语言规范和 Java 标准库没有这样的区别——也许是因为在每个实际实现中,线程调度都被委托给了操作系统。

标签: java multithreading


【解决方案1】:

这本书有一个(易于制作)错误,状态是RUNNABLE,而不是RUNNING。没有RUNNING状态,见the JavaDoc


尚未启动的线程处于此状态。
可运行
在 Java 虚拟机中执行的线程处于此状态。
阻塞
阻塞等待监视器锁的线程处于此状态。
等待
无限期等待另一个线程执行特定操作的线程处于此状态。
TIMED_WAITING
一个线程正在等待另一个线程执行一个操作直到指定的等待时间,就处于这种状态。
已终止
已退出的线程处于此状态。

(我的重点)

这只是一个奇怪的、有点迂腐的名字,因为从技术上讲,它只有在操作系统运行时才会运行。但从 JVM 的角度来看,它正在“运行”。

【讨论】:

  • 所以 JVM 的线程调度器只根据其算法选择一个线程并请求操作系统运行它,这使得它为 JVM “运行”。但是现在,它是由操作系统来实际运行或不运行。可能是多余的评论,但试图重申以确认。
  • @user3518958:我不能肯定,但我认为 JVM 根本没有线程调度程序。我希望它将完全推迟到操作系统。因此,当您启动一个线程时,JVM 会将其与一个 OS 线程相关联,然后将其留给 OS 来决定该线程何时应在 CPU 内核上调度时间。
【解决方案2】:

JVM 不控制线程是否在运行,操作系统可以。 JVM 只知道它是否要求操作系统运行线程,这使得它可以运行。

【讨论】:

    猜你喜欢
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-25
    • 2013-03-19
    相关资源
    最近更新 更多