Dans cette leçon, nous allons nous familiariser avec la classe Selector . Cette classe se trouve dans le package java.nio.channels , vous n'avez donc pas besoin de télécharger ou de configurer quoi que ce soit pour l'utiliser. Un objet Selector peut surveiller un ou plusieurs objets Channel , vérifier qu'ils sont prêts à lire/écrire, etc. Et surtout, un sélecteur a besoin d'un flux, et non d'un flux par canal.

Nous créons des sélecteurs en utilisant la méthode d'ouverture statique :


Selector selector = Selector.open();

Après cela, les canaux peuvent être enregistrés dans un objet sélecteur :


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

Le deuxième paramètre de la méthode de registre détermine quelle opération le sélecteur surveillera. Si vous avez besoin de surveiller plusieurs opérations à la fois, vous pouvez utiliser OR au niveau du bit :


SelectionKey.OP_READ | SelectionKey.OP_WRITE

Lorsqu'une action d'E/S se produit sur l'un des canaux, le sélecteur nous en informe. De cette façon, vous pouvez, par exemple, lire des données à partir d'un grand nombre de sources de données.

Ici, nous devons mentionner qu'un canal doit être en mode non bloquant pour pouvoir être utilisé avec un sélecteur :


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

Il s'ensuit qu'un sélecteur ne fonctionnera pas avec un FileChannel , car un FileChannel ne peut pas être basculé en mode non bloquant (la méthode configureBlocking est déclarée dans la classe SelectableChannel , dont FileChannel n'hérite pas).

D'après le diagramme, vous pouvez voir que les sélecteurs conviennent à une utilisation avec des prises. Nous travaillerons avec eux à la fin du deuxième module.

Clé de sélection

Lors de l'enregistrement d'un canal avec un sélecteur, nous obtenons unClé de sélectionobjet. Cet objet contient des données sur l'enregistrement du canal.

Vous pouvez utiliser la clé pour déterminer si le canal est prêt pour une certaine valeur :


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

La touche peut vous donner le canal et le sélecteur correspondant :


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

Vous pouvez attacher n'importe quel objet à une clé afin de le suivre à l'avenir. Cela peut être fait lors de l'enregistrement du canal (via le troisième argument) ou plus tard :

  1. Clé SelectionKey = channel.register(selector, SelectionKey.OP_ACCEPT, object);

  2. key.attach(objet);

Plus tard, vous pouvez obtenir l'objet attaché à partir de la clé :


Object object = key.attachment();

Conclusion

Après avoir enregistré les chaînes avec un sélecteur, nous pouvons :

  • connaître le nombre de canaux prêts à effectuer des opérations spécifiées
  • bloquer l'exécution de notre programme jusqu'à ce qu'au moins un canal soit prêt
  • obtenir un ensemble de clés pour les canaux prêts
  • et plus

À la fin du deuxième module, nous testerons les sélecteurs en pratique.