Java线程执行I/O操作时的状态

问题描述 投票:0回答:2

假设 Java 线程执行一些 I/O 操作,例如使用传统的阻塞 Java I/O 读取文件。

问题是:等待时线程的状态是什么?

我不知道它是正在运行(正在执行一些主动等待)还是正在等待(也许有某种监视器会在文件数据准备好时唤醒线程)。

我怎样才能找到它?

java java-threads thread-synchronization
2个回答
15
投票

根据我对 javadocs 的阅读,在 I/O 系统调用中被阻塞的线程应该处于 RUNNABLE 状态。

public static final Thread.State RUNNABLE

可运行线程的线程状态。处于可运行状态的线程正在 Java 虚拟机中执行但它可能正在等待来自操作系统的其他资源,例如处理器。

其他可能的线程状态的指定要严格得多,并且相应的规范使它们显然不适用。

我已经通过测试(在 Linux 上使用 OpenJDK Java 8)确认了这一点。

public class Test {
    public static void main(String[] args) throws Exception {
        Thread t = new Thread(new Runnable() {
                public void run() {
                    try {
                        while (true) {
                            System.in.read();   // Block for input
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        t.start();
        while (true) {
            System.out.println("State: " + t.getState());
            Thread.sleep(1000);
        }
    }
}

现在,假设,如果您设计应用程序,以便一个线程将 I/O 请求移交给第二个线程,那么第一个线程将处于 WAITING(或可能是 BLOCKED)状态,等待 I/O 线程传递。然而,普通 Java I/O 的行为并非如此。请求 I/O 的线程是进行系统调用的线程。

我怎样才能找到它?

  • 编写测试;见上文。
  • 深入了解 OpenJDK 源代码。

-2
投票

您可以使用 Thread.getState() 查找线程的状态。它会返回 java.lang.Thread.State

© www.soinside.com 2019 - 2024. All rights reserved.