Tengo una pregunta básica. Por qué y cómo el método de registro de SelectableChannel puede estar en la llamada de bloqueo. Déjame proporcionar un escenario.El hilo de Java bloquea al registrar el canal con el selector mientras se llama a select(). ¿Qué hacer?
He creado un objeto selector en la clase Regístrese de la siguiente manera.
private static Selector selector = Selector.open();
También tengo un método en la misma clase (Registrarse) para registrar el canal con el selector.
public static SelectionKey registerChannel(SelectableChannel channel,
int ops) throws IOException {
channel.configureBlocking(false);
return channel.register(selector, ops);
}
Y hay otra clase llamada de solicitud, el cual tiene un método que lee los datos de los canales, los procesos y las llamadas siguientes método para registrar el canal.
selectonKey = Register.register(socketChannel, SelectionKey.OP_READ);
Aquí en este punto el hilo está bloqueado, sin dar la pista de lo que está esperando. He verificado que el selector está abierto. Por favor, dame algo de ayuda para entender cómo puedo resolver esto. ¿Hay algún bloqueo que pueda liberar?
Cualquier entrada sería apreciada.
Agregando a lo que describí. Pruebas adicionales revelaron que si el método Register.register se llama desde el mismo hilo, puede registrarse, pero luego si otro hilo intenta invocar el método, thread doesn, t move ahead.
+1 para el ejemplo de código. En segundo lugar esto, por experiencia. Bien hecho. – casey
Esto agrega hasta 500 ms de latencia innecesaria a cada registro. Use el enfoque en http://stackoverflow.com/a/2179612/448970 en su lugar. –
@DavidB. No agrega ninguna latencia a cada registro. Es el hilo de selección que bloquea hasta 500 ms, no el hilo de registro, y el hilo de selección siempre querrá bloquear en 'select()' de todos modos. Las afirmaciones en la respuesta son en su mayoría incorrectas. – EJP