我有一个基本问题。为什么以及如何 SelectableChannel 的 register 方法可以阻塞调用。让我提供一个场景。
我在类 Register 中创建了一个 Selector 对象,如下所示。
private static Selector selector = Selector.open();
我在同一个类(Register)中也有一个方法来向选择器注册通道。
public static SelectionKey registerChannel(SelectableChannel channel, int ops)
throws IOException {
channel.configureBlocking(false);
return channel.register(selector, ops);
}
还有一个名为 Request 的类,它具有从通道读取数据、处理并调用以下方法来注册通道的方法。
selectonKey = Register.register(socketChannel, SelectionKey.OP_READ);
此时线程被阻塞,没有给出它在等待什么的线索。我已验证选择器已打开。请为我提供一些帮助以了解如何解决此问题。有没有我可以释放的锁。
任何输入将不胜感激。
添加到我所描述的内容。进一步的测试表明,如果从同一个线程调用 Register.register 方法,它可以注册,但之后如果其他线程尝试调用该方法,则线程不会继续前进。