我试图理解java中的多线程。当我经历各种状态时,Java线程可以进入(新的,可运行的,运行的,等待的/阻塞的,死的)。我试着运行一些简单的代码来检查线程的状态。
我创建了一个扩展MyThread
并覆盖Thread
方法的类run()
。
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();
}
}
运行此类将提供以下输出:
State of thread : NEW Running Mythread. State of thread : RUNNABLE
第2行的输出是我不明白的。当正在执行线程实例的run()
方法时,它如何处于RUNNABLE状态?我在书中看到了一个RUNNING状态(SCJP Suncertified Programmer)。它应该不显示RUNNING吗?
答案 0 :(得分:4)
该书有一个(易于制作)错误,状态为RUNNABLE
,而不是RUNNING
。没有RUNNING
州,请参阅the JavaDoc:
NEW
尚未启动的线程处于此状态。
的 RUNNABLE 强>
在Java虚拟机中执行的线程处于此状态。
BLOCKED
被阻塞等待监视器锁定的线程处于此状态。
WAITING
无限期等待另一个线程执行特定操作的线程处于此状态。
TIMED_WAITING
正在等待另一个线程执行最多指定等待时间的操作的线程处于此状态。
TERMINATED 已退出的线程处于此状态。
(我的重点)
这只是一个奇怪的,略显迂腐的名字,因为从技术上讲,它只在操作系统运行时运行。但它从JVM的角度来看是“正在运行”。
答案 1 :(得分:3)
JVM不控制线程是否正在运行,操作系统会这样做。 JVM只知道它是否要求操作系统运行该线程,这使得它成为RUNNABLE。