gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 19:28:00 24 4
gpt4 key购买 nike

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

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

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

我怎样才能找到它?

谢谢。

最佳答案

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

public static final Thread.State RUNNABLE

Thread state for a runnable thread. A thread in the runnable state is executing in the Java virtual machine but it may be waiting for other resources from the operating system such as processor.

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

我已经通过测试(在 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 的线程是进行系统调用的线程。

How can I find it out?

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

关于Java - 执行 I/O 操作时的线程状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48968984/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com