我正在学习NIO包。我参考了这里的NioServer示例。在NioServer.java
中,选择器线程会阻塞在
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);
}
当远程客户端连接时,会调用
this.accept(key)
方法,在这个方法中将interestOps更改为Read并唤醒选择器。
是这个操作导致选择器选择此通道吗?因此,我们通过这种方式发出信号以选择通道。现在假设在向套接字通道写入数据时,通过更改通道的interest来通知选择器该通道已准备好进行写入。 但是,如果由于套接字缓冲区已满而导致写入未完成,那么我们不会更改interest并将其保持为仅写入。 那么,选择器何时会选择此通道呢?