Java - 执行 I/O 操作时的线程状态
Java - Threads state when performing I/O operations
假设一个 Java 线程执行一些 I/O 操作,例如使用传统阻塞读取文件 Java I/O.
问题是:等待时线程的状态是什么?
我不知道是运行(做一些主动等待)还是WAITING(也许有某种监视器在文件数据准备好时唤醒线程)。
我怎样才能找到它?
谢谢。
您可以使用 Thread.getState() 查看线程的状态。它将 return
java.lang.Thread.State
根据我对 javadoc 的阅读,在 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 请求移交给第二个线程,那么第一个线程将处于等待(或可能已阻塞)状态,等待 I/O线程交付。然而,正常的 Java I/O 并不像那样。请求 I/O 的线程是进行系统调用的线程。
How can I find it out?
- 编写测试;见上文。
- Deep-dive OpenJDK 源代码。
假设一个 Java 线程执行一些 I/O 操作,例如使用传统阻塞读取文件 Java I/O.
问题是:等待时线程的状态是什么?
我不知道是运行(做一些主动等待)还是WAITING(也许有某种监视器在文件数据准备好时唤醒线程)。
我怎样才能找到它?
谢谢。
您可以使用 Thread.getState() 查看线程的状态。它将 return java.lang.Thread.State
根据我对 javadoc 的阅读,在 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 请求移交给第二个线程,那么第一个线程将处于等待(或可能已阻塞)状态,等待 I/O线程交付。然而,正常的 Java I/O 并不像那样。请求 I/O 的线程是进行系统调用的线程。
How can I find it out?
- 编写测试;见上文。
- Deep-dive OpenJDK 源代码。