我正在学习非阻塞 I/O 术语。主要是在学习java Nio。我试图更好地理解非阻塞 I/O,并观察它在 Java Nio 的实现中是如何工作的。
我阅读了十几个与非阻塞 i/o 术语和使用 java Nio 实现非阻塞 i/o 相关的问题和答案。
我到处都看到以下类似的说法。
非阻塞IO不会等待数据被读取或写入才返回。 Java NIO 非阻塞模式允许线程请求向通道写入数据,但非阻塞 IO 不会等待数据被读取或写入才返回。
我尝试用一个使用 Nio 读取文件内容的 Java 代码示例来说明该语句。然而,线程仍然被阻塞在通道的 read() 方法处。
System.out.println("Thread-" + Thread.currentThread().getName()
+ "-" + Thread.currentThread().getId());// Thread-main-1
String filePath = "./resources/nio-demo.txt";
FileInputStream fis = new FileInputStream(new File(filePath));
FileChannel fileChannel = fis.getChannel();
ByteBuffer buf = ByteBuffer.allocate(102400);
int bytesRead = fileChannel.read(buf);
System.out.println(buf.position()); //check how many bytes are written to the buf, always 102400
while (bytesRead != -1)
{
buf.flip();
while (buf.hasRemaining())
{
System.out.print((char) buf.get());
}
buf.clear();
bytesRead = fileChannel.read(buf);
}
fis.close();
据我了解,触发read()方法后,线程会执行下面这行代码。 buf是否已满数据并不重要。 但在这里,线程被阻塞,直到 buf 完成并继续处理序列。
上面的例子读取了一个大约300M的文件,buf为102400。
这种情况让我很困惑;也许我误解了 java Nio 的非阻塞 i/o。
您能帮我解释一下这个情况吗?
java Nio如何实现只有一个线程的纯非阻塞I/O?
也许这里的问题是,
“文件 API 中的所有操作都被阻止”
从 Socket 读取可以是非阻塞的。但即使在 NIO 中,从文件中读取也是阻塞的。