xylonlee 2010-12-30 21:54
浏览 714
已采纳

NIO SelectionKey.cancel只对下一次select()生效?

貌似SelectionKey.cancel只对下一次的Selector.cancel()有效,代码如下,只贴了简要的:

nKeys = selector.select();
ExecutorService exec = Executors.newFixedThreadPool(10);
if (nKeys > 0)
{
Set selectedKeys = selector.selectedKeys();
Iterator it = selectedKeys.iterator();
while (it.hasNext())
{
SelectionKey selectionKey = (SelectionKey) it.next();
it.remove();
if (selectionKey.isAcceptable())
{
。。。 //省略了accept()通道的注册代码
}
else if(selectionKey.isReadable())
{
exec.execute(new ProcessThread(selectionKey)); //如果客户端数据没有处理完整,将会重新注册该key
selectionKey.cancel();
}
}
}

客户端只连了一次,在ProcessThread(selectionKey).run的处理过程中,select()还有两次成功返回,第一次返回时nKeys=0,第二次nKey=1。如果使用单步调试,也就是在exec.execute(new ProcessThread(selectionKey))和下一次select()之间有足够的时间处理通道的数据,则select()将阻塞。
不太明白为什么selectionKey.cancel()不起作用。

  • 写回答

7条回答 默认 最新

  • beneo 2010-12-31 00:11
    关注

    我们只是创建了一个selectedKey

    第一次注册accepte

    在select()后,返回 1,因为含有一个selectedKey

    在handle accepte 里面,key.insertOtps(read)

    在selcte()后,返回1,因为只有一个selectedKey

    这个时候进入isReadable
    在这个时候cancel()

    那么第三次select()后,就是0了。。因为没有selectedKey了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 MATLAB动图问题
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名