当我有一个注册到SocketChannel的selector.select(),并且我在一个单独的线程中关闭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