本文研究 Java 线程的 JVM 线程状态与操作系统(Windows 10)线程状态的对比情况。
用 jstack
结论:
一个 Java 线程调用 Object#wait 方法进入 JVM WAITING 状态时,其操作系统线程状态会变为 Wait。
一个 Java 线程由于网络操作被阻塞时,其 JVM 线程状态为 RUNNABLE ,操作系统线程状态为 Wait。
以上 2 种情况下,Java 线程都不会参与线程调度,因为线程调度由操作系统而不是 JVM 控制,操作系统线程状态为 Wait 的线程不会参与线程调度。
线程的操作 | JVM 线程状态 | 操作系统线程状态 |
---|---|---|
Object lock = new Object(); synchronized (lock) { lock.wait(); } |
WAITING | Wait |
ServerSocket serverSocket = new ServerSocket(12345); serverSocket.accept(); |
RUNNABLE | Wait |
JVM 线程状态
操作系统线程状态