如果我愿意写:
int selectedChannels = selector.select(); Set selectedKeys = selector.selectedKeys(); if ( selectedChannels != selectedKeys.size() ) { // Selector.select() returned because of a call to Selector.wakeup() // so do synchronization. } // Continue with handling selected channels.
它会正确检测到唤醒呼叫吗?
Backgroundinformation:
我正在编写一个服务器,大多数时候只接收数据包并将它们存储在一个文件中.应用程序很少需要向自己发送特殊数据包.为此,它启动连接(从不同的线程)到服务器套接字:
SocketChannel channel = SocketChannel.open(); channel.configureBlocking( false ); channel.connect( new InetSocketAddress( InetAddress.getLocalHost(), PORT )); selector.wakeup(); SelectionKey key = channel.register( selector, SelectionKey.OP_CONNECT );
问题是如果主线程已经在Selector.select()中,SelectableChannel.register()可能会阻塞.为了防止这种情况发生,我正在调用Selector.wakeup(),让主线程从select()过早返回.为了确保其他线程有机会完成寄存器调用,我必须同步主线程,但是每次从select()返回后我都必须这样做.如果我可以检测是否因为wakeup()调用而从select()返回,那么我可以针对这种情况对其进行优化.
因此,理论上顶级代码片段应该可以工作,但我想知道它是否只会这样做,因为它依赖于一些未指定的行为?
谢谢你的任何提示.