本文研究 Java 线程的 JVM 线程状态与操作系统(Windows 10)线程状态的对比情况。

    用 jstack 命令查看 JVM 线程状态,在 PowerShell 中用 “(Get-Process -Id ).Threads” 命令查看操作系统线程状态。

    结论:
    一个 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

    image.png
    JVM 线程状态
    image.png
    操作系统线程状态