什么是阻塞IO?请举一个阻塞IO的例子。
阻塞 I/O 指的是 I/O 操作会阻塞调用线程直到操作完成。在阻塞 I/O 模型中,一个线程发起了 I/O 操作后,必须等待数据读取或者写入完成才能继续执行其他操作。如果 I/O 请求不能立即完成,线程会一直等待,直到有数据可以处理或者是 I/O 操作真的完成。
这种模型在处理单个连接时很简单和直接,但是它不能很好地扩展到大量并发连接,因为每个 I/O 操作都可能导致线程阻塞,这意味着需要更多的线程来处理其他并发任务,而线程资源是有限且代价昂贵的。
阻塞 I/O 的例子:
下面是 Java 中使用 FileInputStream
和 BufferedReader
的例子,这是一个标准的阻塞 I/O 操作的例子。
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class BlockingIOExample {
public static void main(String[] args) {
// 使用 BufferedReader 读取文件内容
try (BufferedReader reader = new BufferedReader(new FileReader("path/to/file.txt"))) {
String line;
while ((line = reader.readLine()) != null) {
// 处理每一行数据
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
在这个例子中,readLine()
方法是一个阻塞调用。如果文件内容还没有准备好,或者文件很大,需要时间读取,那么 readLine()
方法会阻塞,直到下一行数据可用为止。在这期间,调用 readLine()
的线程将不能执行其他任务。
这种阻塞模式很适合单线程程序,但在需要处理大量并发连接或请求的服务器端应用程序中,阻塞 I/O 可能会成为性能瓶颈。在这种情况下,使用非阻塞 I/O 或者异步 I/O 通常是更好的选择。