基本的な質問があります。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メソッドが同じスレッドから呼び出された場合は登録できますが、その後、他のスレッドがメソッドを呼び出そうとしても、スレッドは先に進みません。