在选择器.select()

时间:2019-02-20 19:53:37

标签: java nio socketchannel

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

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

1 个答案:

答案 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