当我在一个SocketChannel中注册了一个selector.select(),并且在单独的线程中关闭了SocketChannel的同位体时,selector.select()返回,并且设置了该通道的READ操作。如果我有一个ServerSocketChannel注册到选择器,并且我关闭了ServerSocketChannel,则selector.select()不返回。无论如何,我是否可以检测到在选择器.select()中被阻塞时ServerSocketChannel已关闭?
我尝试使用selector.wakeup(),遍历一组键(未选择的键),查看组中是否有任何未打开的通道,但是一旦在ServerSocketChannel上完成关闭,它就会已从选择器中注销,因此它不在select.keys()集中。
答案 0 :(得分:1)
反正我可以检测到ServerSocketChannel吗? 在selector.select()中被阻止时被关闭了?
如果您想返回selector.select()
,以便可以从选定的键中提取关闭的通道,则否。正如文档所说
仅在选择了至少一个通道后返回 选择器的唤醒方法被调用,或者当前线程 被打断,以先到者为准。
由于没有{em> no 这样的兴趣操作,如OP_CLOSE
,使select
方法在通道关闭时返回的唯一方法是显式地访问wakeup
。但是密钥被隐式取消。
无论如何,对于封闭的频道您无能为力。
另外,EPollSelectorProvider
正在代理对基础epoll
的调用,并且它没有想要的事件。 http://man7.org/linux/man-pages/man2/epoll_ctl.2.html