Java-Thread blockiert beim Registrieren des Kanals den Selektor, während select () aufgerufen wird. Was ist zu tun?

Ich habe eine grundlegende Frage. Warum und wie SelectableChannels Registrierungsmethode den Aufruf blockieren kann. Lassen Sie mich ein Szenario bereitstellen.

Ich habe ein Selector-Objekt in der Klasse Register wie folgt erstellt.

<code>private static Selector selector = Selector.open();
</code>

Ich habe auch eine Methode in der gleichen Klasse (Register), um den Kanal mit dem Selektor zu registrieren.

<code>public static SelectionKey registerChannel(SelectableChannel channel, int ops)
                             throws IOException {
   channel.configureBlocking(false);
   return channel.register(selector, ops);
}
</code>

Und es gibt eine weitere Klasse namens Request, die über eine Methode verfügt, mit der die Daten von Kanälen gelesen, verarbeitet und die folgende Methode aufgerufen werden kann, um den Kanal zu registrieren.

<code>selectonKey = Register.register(socketChannel, SelectionKey.OP_READ);
</code>

Hier zu diesem Zeitpunkt ist der Thread blockiert und gibt keinen Hinweis darauf, worauf er wartet. Ich habe überprüft, dass der Selektor geöffnet ist. Bitte helfen Sie mir, um zu verstehen, wie ich das beheben kann. Gibt es eine Sperre, die ich freigeben kann?

Jede Eingabe wäre dankbar.

Hinzufügen zu dem, was ich beschrieben habe. Weitere Tests ergaben, dass, wenn die Register.register-Methode von demselben Thread aufgerufen wird, sie registriert werden kann. Wenn danach ein anderer Thread versucht, die Methode aufzurufen, wird der Thread nicht fortgesetzt.

Antworten auf die Frage(5)

Ihre Antwort auf die Frage