MST

星途 面试题库

面试题:Java中如何实现简单的流阻塞操作

在Java中,假设你有一个输入流`InputStream`,请描述如何使用常规方法实现流的阻塞读取操作,并给出关键代码片段。同时说明在这种阻塞读取下,线程的状态会发生怎样的变化。
11.3万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

实现流的阻塞读取操作及关键代码

在Java中,InputStreamread()方法本身就是阻塞式读取。以下是关键代码示例:

import java.io.IOException;
import java.io.InputStream;

public class InputStreamBlockingRead {
    public static void main(String[] args) {
        try (InputStream inputStream = System.in) { // 以标准输入流为例
            System.out.println("请输入数据(按回车键结束):");
            int data;
            while ((data = inputStream.read()) != -1) {
                System.out.print((char) data);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在上述代码中,inputStream.read() 方法会阻塞当前线程,直到有数据可读、流结束或者发生I/O错误。

阻塞读取下线程状态变化

当执行read()方法进行阻塞读取时,线程会从运行状态(RUNNABLE) 转变为 阻塞状态(BLOCKED)。这意味着线程暂时停止执行,让出CPU资源,等待输入数据的到来。一旦有数据可读,线程会重新进入运行状态(RUNNABLE),继续执行后续代码。如果流结束或者发生I/O错误,read()方法会返回相应的标识(如 -1 表示流结束),线程也会继续执行后续的代码逻辑。