NIO 패키지를 배우고 있습니다. NioServer 예제를 here에서 참조합니다. select() 호출시 java nio 선택기가 차단을 해제 할 때
this.selector.select();
Iterator<SelectionKey> selectedKeys = this.selector.selectedKeys().iterator();
while (selectedKeys.hasNext()) {
SelectionKey key = selectedKeys.next();
selectedKeys.remove();
if (!key.isValid()) {
continue;
}
if (key.isAcceptable()) {
this.accept(key);
} else if (key.isReadable()) {
this.read(key);
} else if (key.isWritable()) {
this.write(key);
}
원격 클라이언트가 연결
에NioServer.java
블록 선택기 스레드,
this.accept(key)
가 호출되고,이 방법에 관심 interestOps 읽기로 변경하고 선택을 깨우고있다. 이 무엇입니까 선택기가이 채널을 선택하게합니까? 그래서 우리는 채널이 선택되도록 이러한 방식으로 신호를 보내고 있습니까?
채널에 쓸 준비가되었다는 관심을 변경하여 소켓 채널 선택기에 대한 쓰기가 신호되었다고 가정 해 보겠습니다. 그러나 코드 에서처럼 소켓 버퍼가 꽉 찼기 때문에 쓰기가 완료되지 않았다고 가정하면 관심을 변경하지 않고 쓰기 전용 상태로 유지합니다. 그러면 선택기에서이 채널을 언제 선택합니까? 클라이언트와의 통신을위한 새로운 소켓 채널을 반환
무한대로 차단하지 말고 대신 과부하 된 select (long timeout) 메서드를 사용하십시오. – Schildmeijer