>  Q&A  >  본문

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

高洛峰高洛峰2719일 전503

모든 응답(2)나는 대답할 것이다

  • 怪我咯

    怪我咯2017-04-18 09:44:57

    읽기 이벤트는 서버의 선택기에 등록됩니다. 특정 순간에 클라이언트는 I/O가 차단되면 read() 메서드를 호출하여 데이터를 차단하게 됩니다. NIO 서버는 선택기의 데이터를 읽습니다. 읽기 이벤트를 추가합니다. 서버의 처리 스레드는 폴링 방식으로 선택기에 액세스합니다. 선택기에 액세스할 때 관심 있는 이벤트가 도착하는 것을 발견하면 관심 있는 이벤트가 도착하지 않으면 해당 이벤트가 도착할 때까지 처리 스레드가 차단됩니다.

    자세한 내용은 여기에서 확인할 수 있습니다.
    Java 차단 IO 및 비차단 IO

    회신하다
    0
  • 天蓬老师

    天蓬老师2017-04-18 09:44:57

    우선 블로킹과 비블로킹의 개념을 알아야 합니다. 블로킹이란 이 스레드가 다른 작업을 수행할 수 없고 여기서만 기다릴 수 있다는 의미입니다. 비차단이란 이 스레드가 다른 작업을 수행할 수 있고 여기에서 항상 기다릴 필요가 없음을 의미합니다.
    NIO의 논블로킹 원리에 대해 이야기하기 전에 먼저 전통적인 IO에 대해 이야기해야 합니다. 기존 IO는 바이트 단위로 전송됩니다. 즉, 한 번에 1바이트가 전송됩니다. 데이터 전송의 효율성을 높이기 위해 버퍼가 있는 입출력 모드를 도입하여 매번 많은 양의 바이트를 전송할 수 있지만 이로 인해 읽기(쓰기) 버퍼가 완료될 때까지 프로그램이 대기하게 됩니다. 가득 차지 않음 스트림이 가득 차거나 닫힐 때까지 읽거나 쓸 수 없습니다. 이로 인해 프로그램이 차단되고 프로그램의 실행 효율성이 저하됩니다. ,

    회신하다
    0
  • 취소회신하다