首页 > 解决方案 > 在 selector.select() 中检测 ServerSocketChannel 何时关闭

问题描述

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

我尝试使用 selector.wakeup(),并通过一组键(未选择的键),并查看该组中是否有任何未打开的通道,但是一旦在 ServerSocketChannel 上完成关闭,它就会从选择器,所以它不在 select.keys() 集中。

标签: javaniosocketchannel

解决方案


无论如何我可以检测到 ServerSocketChannel 在 selector.select() 中被阻止时已关闭?

如果你想要selector.select()返回,那么你可以在选定的键中提取封闭的通道,那么不。正如文档所说

它仅在至少选择一个通道、调用此选择器的唤醒方法或当前线程被中断(以先到者为准)后才返回。

由于没有这样的兴趣操作OP_CLOSE,因此使select方法在通道关闭时返回的唯一方法是wakeup显式。但是密钥被隐式取消。

无论如何,使用封闭通道可以做的事情并不多。

也是EPollSelectorProvider代理对底层的调用epoll,它也没有你想要的事件。http://man7.org/linux/man-pages/man2/epoll_ctl.2.html


推荐阅读