【问题标题】:Java - Threads state when performing I/O operationsJava - 执行 I/O 操作时的线程状态
【发布时间】:2018-08-04 18:10:26
【问题描述】:

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

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

我不知道它是 RUNNING(进行一些主动等待)还是 WAITING(可能有某种监视器在文件数据准备好时唤醒线程)。

我怎样才能找到它?

谢谢。

【问题讨论】:

    标签: java java-threads thread-synchronization


    【解决方案1】:

    根据我对 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

      【讨论】:

        猜你喜欢
        • 2019-09-24
        • 1970-01-01
        • 1970-01-01
        • 2017-02-15
        • 1970-01-01
        • 2017-12-20
        • 1970-01-01
        • 1970-01-01
        • 2013-05-26
        相关资源
        最近更新 更多