在 selector.select() 中检测 ServerSocketChannel 何时关闭

Detecting when ServerSocketChannel closes when in selector.select()

当我将 selector.select() 注册到 SocketChannel 时,我在单独的线程 selector.select() returns 中关闭 SocketChannel 的对等方,并且该通道的 READ操作已设置。如果我有一个 ServerSocketChannel 注册到选择器,并且我关闭了 ServerSocketChannel,selector.select() 不会 return。无论如何我可以检测到 ServerSocketChannel 在 selector.select() 中被阻止时已关闭?

我尝试使用 selector.wakeup() 并检查键集(未选择的键),并查看该组中是否有任何未打开的频道,但是一旦关闭就完成了ServerSocketChannel,它已从选择器中注销,因此它不在 select.keys() 集合中。

Is there anyway i can detect that the ServerSocketChannel was closed while being blocked in selector.select()?

如果您想要 selector.select() returns 以便您可以在选定的键中提取已关闭的频道,则否。正如文档所说

It returns only after at least one channel is selected, this selector's wakeup method is invoked, or the current thread is interrupted, whichever comes first.

因为没有这样的兴趣操作OP_CLOSE,唯一的方法是select方法return关闭通道是wakeup 明确地。但是密钥被隐式取消了。

不管怎样,关闭频道能做的事情并不多。

另外 EPollSelectorProvider 正在代理对基础 epoll 的调用,它也没有您想要的事件。 http://man7.org/linux/man-pages/man2/epoll_ctl.2.html