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

问题描述 投票:1回答:1

我使用选择器注册了一个socketchannel,当我取消该套接字通道和选择器的密钥时,该密钥永远无效。因此,将来调用将socketchannel添加到选择器会抛出CancelledKeyException。

Selection key = channel.register(selector, ops, this);
key.cancel();
key = channel.register(selector, ops, this);

文件说明相同,

If this key has already been cancelled then invoking this method has no 
effect. Once cancelled, a key remains forever invalid.

所以,我认为我应该获得另一个“选择键”,但似乎不可能。注册时,每个通道都会为每个选择器创建一个唯一的键,但是当您取消该键时,它不会从通道的键集中删除该键。所以,你不能使用那个socketchannel和selector对。

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

java nio
1个回答
0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.