当前位置:  开发笔记 > 编程语言 > 正文

如何检测Selector.wakeup调用

如何解决《如何检测Selector.wakeup调用》经验,为你挑选了0个好方法。

如果我愿意写:

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()返回,那么我可以针对这种情况对其进行优化.

因此,理论上顶级代码片段应该可以工作,但我想知道它是否只会这样做,因为它依赖于一些未指定的行为?

谢谢你的任何提示.

推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有