簡體   English   中英

在 selector.select() 中檢測 ServerSocketChannel 何時關閉

[英]Detecting when ServerSocketChannel closes when in selector.select()

當我將 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM