Java 线程块,同时使用 selector 注册通道,同时调用 select()。怎么办?
2022-09-03 03:29:17
我有一个基本问题。为什么以及如何选择通道的寄存器方法可以阻塞调用。让我提供一个场景。
我在类 Register 中创建了一个 Selector 对象,如下所示。
private static Selector selector = Selector.open();
我在同一类(寄存器)中也有一个方法,用于向选择器注册通道。
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方法,它能够注册,但是如果其他线程尝试调用该方法,线程就不会继续前进。