我使用选择器注册了一个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对。
这是对的吗?这种实现毫无意义,所以我希望我能错过一些东西。
这是奇怪的一个。在我找到它时,我无法找到的文档深处的某个地方是取消的声明仅在下一个select()
上处理。所以你必须在取消后和第二个selectNow()
之前调用register()
。
但是,如果没有干预select()
,你为什么这样做是一个谜。不要取消密钥,不要重新注册:只需更改其interestOps
。