为同一个选择器注册socketChannel调用会抛出异常

时间:2017-12-21 23:28:31

标签: java nio

当我取消该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&选择对永远。

这是对的吗?这种实现毫无意义,所以我希望我能错过一些东西。

1 个答案:

答案 0 :(得分:0)

这是奇怪的一个。在我找到它时,我无法找到的文档深处的某个地方是取消的声明仅在下一个select()处理。因此,您必须在取消后和第二个selectNow()之前致电register()

但是,如果没有干预select(),你为什么这样做是一个谜。不要取消密钥,不要重新注册:只需更改其interestOps