猿问

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

都是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); 的时候岂不是也是阻塞的?


holdtom
浏览 909回答 3
3回答

跃然一笑

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

交互式爱情

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

慕田峪7331174

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

相关分类

Java
我要回答