面试题答案
一键面试实现流的阻塞读取操作及关键代码
在Java中,InputStream
的read()
方法本身就是阻塞式读取。以下是关键代码示例:
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 表示流结束),线程也会继续执行后续的代码逻辑。