En esta lección, nos familiarizaremos con la clase Selector . Esta clase está en el paquete java.nio.channels , por lo que no necesita descargar ni configurar nada para usarla. Un objeto Selector puede monitorear uno o más objetos Channel , verificar su preparación para leer/escribir, etc. Y lo más importante, un selector necesita una transmisión, no una transmisión por canal.

Creamos selectores usando el método abierto estático :


Selector selector = Selector.open();

Después de eso, los canales se pueden registrar en un objeto selector:


SelectionKey key1 = channel1.register(selector, SelectionKey.OP_READ);
SelectionKey key2 = channel2.register(selector, SelectionKey.OP_WRITE);

El segundo parámetro del método de registro determina qué operación controlará el selector. Si necesita monitorear varias operaciones a la vez, puede usar OR bit a bit:


SelectionKey.OP_READ | SelectionKey.OP_WRITE

Cuando se produce una acción de E/S en cualquiera de los canales, el selector nos avisa. De esta manera, puede, por ejemplo, leer datos de una gran cantidad de fuentes de datos.

Aquí debemos mencionar que un canal debe estar en modo sin bloqueo para que pueda usarse con un selector:


channel1.configureBlocking(false);
channel2.configureBlocking(false);
SelectionKey key1 = channel1.register(selector, SelectionKey.OP_READ);
SelectionKey key2 = channel2.register(selector, SelectionKey.OP_WRITE);

De ello se deduce que un selector no funcionará con un FileChannel , porque un FileChannel no se puede cambiar al modo sin bloqueo (el método configureBlocking se declara en la clase SelectableChannel , que FileChannel no hereda).

En el diagrama, puede ver que los selectores son adecuados para usar con enchufes. Trabajaremos con ellos al final del segundo módulo.

Clave de selección

Al dar de alta un canal con un selector, obtenemos unClave de selecciónobjeto. Este objeto contiene datos sobre el registro del canal.

Puede usar la tecla para determinar si el canal está listo para un cierto valor:


key.isReadable()
key.isAcceptable()
key.isConnectable()
key.isWritable()

La tecla puede darte el canal y selector correspondiente:


Channel channel = key.channel();
Selector selector = key.selector();

Puede adjuntar cualquier objeto a una llave para rastrearlo en el futuro. Esto se puede hacer durante el registro del canal (a través del tercer argumento) o más tarde:

  1. Clave SelectionKey = canal.registrar(selector, SelectionKey.OP_ACCEPT, objeto);

  2. clave.adjuntar(objeto);

Más tarde, puede obtener el objeto adjunto de la clave:


Object object = key.attachment();

Conclusión

Después de registrar canales con un selector, podemos:

  • averiguar el número de canales listos para realizar operaciones específicas
  • bloquear la ejecución de nuestro programa hasta que al menos un canal esté listo
  • obtener un juego de claves para canales listos
  • y más

Al final del segundo módulo, probaremos los selectores en la práctica.