如果我要写:
int selectedChannels = selector.select(); 设置 selectedKeys = selector.selectedKeys(); if ( selectedChannels != selectedKeys.size() ) { // Selector.select() 因为调用了 Selector.wakeup() 而返回 // 同步也是如此。 } // 继续处理选定的通道。
它会正确检测到唤醒呼叫吗?
背景资料:
我正在编写一个服务器,它大部分时间只是接收数据包并将它们存储在一个文件中。应用程序很少需要向自己发送一个特殊的数据包。为此,它会(从不同的线程)启动到服务器套接字的连接:
SocketChannel 通道 = SocketChannel.open(); 通道.configureBlocking(假); channel.connect(new InetSocketAddress(InetAddress.getLocalHost(), PORT)); 选择器.唤醒(); SelectionKey key = channel.register( selector, SelectionKey.OP_CONNECT );
问题是如果主线程已经在 Selector.select() 中,SelectableChannel.register() 可能会阻塞。为了防止这种情况发生,我调用了 Selector.wakeup(),这让主线程过早地从 select() 返回。为了确保其他线程有机会完成注册调用,我必须同步主线程,但我必须在每次从 select() 返回后进行同步。如果我可以检测到它是否因为 wakeup() 调用而从 select() 返回,那么我可以针对这种情况对其进行优化。
所以,理论上最上面的代码片段应该可以工作,但我想知道它是否只会这样做,因为它依赖于一些未指定的行为?
感谢您的任何提示。