在之前的文章Java线程状态与内核线程状态的对应关系中讲解了JVM线程与内核线程之间的状态对应关系,但是仅仅是TIMED_WAITING状态的讲解,本篇文章我们把JVM线程的所有状态与内核线程的状态对应关系全部验证讲解一遍.
【验证:JVM中的WAITING状态对应内核线程的Sleep状态】
public class ThreadStatus {
private static Object LOCK = new Object();
public static void main(String[] args) {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
synchronized (LOCK) {
System.out.println("Current thread is " + Thread.currentThread().getName());
try {
LOCK.wait();
} catch (InterruptedException e) {
}
}
}
}, "MyThreadStatus");
t.start();
}
}
编译并运行以上程序.
查看进程ID
PID=3519
打印堆栈信息
从堆栈信息可以看出, JVM中的线程状态是WAITING. 我们再根据nid=0xdcc,间接得到内核线程的十进制
对应的十进制是3532
我们再查看内核线程的状态
可以看到内核线程的状态是Sleep
【验证:JVM中的BLOCKED状态对应内核线程的Sleep状态】
public class ThreadStatus {
private static Object LOCK = new Object();
public static void main(String[] args) {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
synchronized (LOCK) {
System.out.println("Current thread is " + Thread.currentThread().getName());
}
}
}, "MyThreadStatus");
t.start();
synchronized (LOCK) {
try {
Thread.sleep(1000 * 60 * 60);
} catch (InterruptedException e) {
}
}
}
}
代码的主要含义是让主线程main先获取到锁再休眠(不会释放锁),接下来MyThreadStatus线程获取不到锁,进入BLOCKED状态.
按照上面一样的操作,最后我们查看JVM的线程状态以及内核线程的状态
【验证:JVM线程阻塞在IO时,JVM线程状态RUNNABLE与内核线程状态Sleep对应】
import java.io.IOException;
import java.net.ServerSocket;
public class ThreadStatus {
public static void main(String[] args) {
ServerSocket server;
try {
server = new ServerSocket(8080);
server.accept();
System.out.println("accept success...");
} catch (IOException e) {
}
}
}
【验证:JVM线程状态RUNNABLE与内核线程的RUNNABLE或RUNNING对应】
public class ThreadStatus {
public static void main(String[] args) {
while (true) {
System.out.println("current thread is " + Thread.currentThread().getName());
}
}
}
代码的含义就是让main线程一直运行
查看进程ID
PID=5149
打印并查看线程栈信息
对应的JVM线程状态是RUNNABLE
继续查看内核线程状态
对应的内核线程状态是RUNNING