当我取消该socketchannel&的密钥时,我用一个选择器注册了一个socketchannel。选择器,该键永远无效。因此,将来调用将socketchannel添加到选择器会抛出CancelledKeyException。
Selection key = channel.register(selector, ops, this);
key.cancel();
key = channel.register(selector, ops, this);
Documentations陈述相同,
If this key has already been cancelled then invoking this method has no
effect. Once cancelled, a key remains forever invalid.
所以,我以为我应该获得另一个"选择键"但似乎不可能。当您注册时,每个频道为每个选择器创建一个唯一键,但是当您取消该键时,它不会从频道的键集中删除该键。所以,你不能使用那个socketchannel&选择对永远。
这是对的吗?这种实现毫无意义,所以我希望我能错过一些东西。
答案 0 :(得分:0)
这是奇怪的一个。在我找到它时,我无法找到的文档深处的某个地方是取消的声明仅在下一个select()
处理。因此,您必须在取消后和第二个selectNow()
之前致电register()
。
但是,如果没有干预select()
,你为什么这样做是一个谜。不要取消密钥,不要重新注册:只需更改其interestOps
。