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

问题描述 投票:2回答:1

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

我尝试使用selector.wakeup(),并通过一组键(不是选定的键),并查看集合中是否有未打开的通道,但只要在ServerSocketChannel上完成关闭,就会从中取消注册选择器,因此它不在select.keys()集中。

java nio socketchannel
1个回答
1
投票

无论如何我可以检测到ServerSocketChannel在selector.select()被阻塞时被关闭了吗?

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

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

由于没有像OP_CLOSE这样的兴趣,使得select方法在通道关闭时返回的唯一方法是明确地使用wakeup。但关键是隐含取消。

无论如何,你可以用封闭的频道做多少。

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

© www.soinside.com 2019 - 2024. All rights reserved.