Ich lerne gerade das NIO-Paket. Ich beziehe mich auf das NioServer Beispiel von aquí . Der Selektorfaden in NioServer.java
Blöcke auf
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);
}
Wenn ein entfernter Client eine Verbindung herstellt, this.accept(key)
aufgerufen und in dieser Methode die Zinsen interestOps auf Read geändert und der Selektor geweckt. Ist es das, was den Selektor veranlasst, diesen Kanal auszuwählen? Wir signalisieren also auf diese Weise, dass der Kanal ausgewählt werden soll?
Nehmen wir nun an, dass beim Schreiben in eine Steckdose der Kanalselektor durch Änderung des Interesse, dass der Kanal zum Schreiben bereit ist. Aber nehmen wir an, dass der Schreibvorgang nicht abgeschlossen werden konnte, weil der Socket-Puffer voll war, wie im Code gezeigt, dann ändern wir das Interesse nicht und lassen es so, wie es ist, nur zum Schreiben. Wann wird dann der Selektor diesen Kanal auswählen?