为了账号安全,请及时绑定邮箱和手机立即绑定

NIO非阻塞表现在什么地方?

NIO非阻塞表现在什么地方?

holdtom 2019-03-05 11:19:07
都是NIO是面向缓冲区的非阻塞的io,面向缓冲区倒是好理解,非阻塞到底体现在什么地方?莫不是selector使得NIO是非阻塞的?像下面代码:    RandomAccessFile aFile = new RandomAccessFile("data/nio-data.txt", "rw");      FileChannel inChannel = aFile.getChannel();      ByteBuffer buf = ByteBuffer.allocate(48);      int bytesRead = inChannel.read(buf);      while (bytesRead != -1) {           System.out.println("Read " + bytesRead);          buf.flip();                while(buf.hasRemaining()){              System.out.print((char) buf.get());          }          buf.clear();          bytesRead = inChannel.read(buf);      }      aFile.close();  在int bytesRead = inChannel.read(buf); 的时候岂不是也是阻塞的?
查看完整描述

3 回答

?
跃然一笑

TA贡献1826条经验 获得超6个赞

非阻塞不能体现在这种文件的读取上,这种读文件就是阻塞的。所谓非阻塞说的是其他的情况,比如NioServerSocketChannel.


查看完整回答
反对 回复 2019-04-23
?
交互式爱情

TA贡献1712条经验 获得超3个赞

服务端的selector上注册了读事件,某时刻客户端给服务端发送了一些数据,阻塞I/O这时会调用read()方法阻塞地读取数据,而NIO的服务端会在selector中添加一个读事件。服务端的处理线程会轮询地访问selector,如果访问selector时发现有感兴趣的事件到达,则处理这些事件,如果没有感兴趣的事件到达,则处理线程会一直阻塞直到感兴趣的事件到达为止。

具体可以看这里:
Java阻塞IO与非阻塞IO


查看完整回答
反对 回复 2019-04-23
?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

首先你要知道阻塞和非阻塞的概念,阻塞体现在这个线程不能干别的了,只能在这里等着。非阻塞体现在这个线程可以去干别的,不需要一直在这等着。
说NIO的非阻塞原理之前,我们需要先说一下传统的io。传统的IO是按字节传输的,即每次传输一个字节。为了提高数据传输效率,引进了带缓冲区得输入输出模式,这样每次就可以传输大量的字节数,但是,会导致在读(写)缓冲区没有满的情况下,程序会一直等待,直到满或者关闭流才能读取(写入)。这样导致程序阻塞,降低了程序的执行效率。、


查看完整回答
反对 回复 2019-04-23
  • 3 回答
  • 0 关注
  • 908 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信