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

7
假设一个Java线程执行一些I/O操作,比如用传统的阻塞Java I/O读取文件。
问题是:当等待时,线程的状态是什么?
我不知道它是运行中(进行某种主动等待)还是等待中(也许有一种监视器在文件数据准备好时唤醒线程)。
我该如何找出来?
谢谢。
2个回答

14
根据我的阅读,被阻塞在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源代码。

-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接