【发布时间】:2011-05-16 14:11:31
【问题描述】:
我正在学习 NIO 包。我参考了here 中的 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 并唤醒选择器。
这是导致选择器选择此频道的原因吗?所以我们以这种方式发出信号来选择要选择的频道?
现在假设写入套接字通道选择器是通过更改 对通道已准备好写入感兴趣。 但是假设由于套接字缓冲区已满而导致写入未完成,如代码所示,那么我们不改变兴趣并保持其为只写。 那么选择器什么时候会选择这个频道呢?
【问题讨论】:
-
应避免无限期阻塞,而应使用重载的 select(long timeout) 方法。