java - 在 selector.select() 中检测 ServerSocketChannel 何时关闭
问题描述
当我将 selector.select() 注册到 SocketChannel 并在单独的线程中关闭 SocketChannel 的对等方时,selector.select() 返回,并且设置了该通道的 READ 操作。如果我有一个 ServerSocketChannel 注册到选择器,并且我关闭了 ServerSocketChannel,则 selector.select() 不会返回。无论如何我可以检测到 ServerSocketChannel 在 selector.select() 中被阻止时已关闭?
我尝试使用 selector.wakeup(),并通过一组键(未选择的键),并查看该组中是否有任何未打开的通道,但是一旦在 ServerSocketChannel 上完成关闭,它就会从选择器,所以它不在 select.keys() 集中。
解决方案
无论如何我可以检测到 ServerSocketChannel 在 selector.select() 中被阻止时已关闭?
如果你想要selector.select()
返回,那么你可以在选定的键中提取封闭的通道,那么不。正如文档所说
它仅在至少选择一个通道、调用此选择器的唤醒方法或当前线程被中断(以先到者为准)后才返回。
由于没有这样的兴趣操作OP_CLOSE
,因此使select
方法在通道关闭时返回的唯一方法是wakeup
显式。但是密钥被隐式取消。
无论如何,使用封闭通道可以做的事情并不多。
也是EPollSelectorProvider
代理对底层的调用epoll
,它也没有你想要的事件。http://man7.org/linux/man-pages/man2/epoll_ctl.2.html
推荐阅读
- macos - 无法使用 .NET Core 2.1 为 Mac OS 创建 dmg 可执行文件
- php - 在PHP中逗号后将地址等分为两部分
- php - 修改字符串内的 4 位数字并插入冒号
- powerbi - Power Bi 自定义过滤器 - 如何添加与多个类别的交互
- c# - “连接必须有效且打开” - DataReader 问题
- c# - 如何垂直翻转 PathGeometry?
- python-3.x - 尝试在浏览器中打开 URL 时系统找不到指定的文件
- azure - 我们能否将 Azure 应用程序洞察配置为仅对请求遥测进行采样而不对其余部分进行采样
- typescript - 尝试使用接口进行分配
- visual-studio-code - 我应该在哪里保存扩展数据以便我在更新扩展时可以检索这些数据?